2017-02-07 5 views
1

モジュールでは、このような2つのクラスを追加したいと思います。haskellで同じ変数を含む2つのデータ型を宣言するには?

data Person = Person { name :: String -- and some other details 
        } 

data PetAnimal = PetAnimal { name :: String 
          } 

これはうまくいくと思われましたが、ghcは複数の名前の宣言について不平を言っています。これをどのように達成するのですか?

+3

、あなたは '追加することによって、これを許可するために' DuplicateRecordFields'の拡張機能を使用することができ、ファイルの先頭に '{ - - #LANGUAGE DuplicateRecordFields番号}。 –

+0

ありがとうございます。私は7.6.3を使用しています。 とにかく、それを働かせることは別として、なぜこれがデフォルトではうまくいかないのかという理念を理解したいと思いますか? –

答えて

6

ここでの問題は、私は信じて、あなたは一つの機能

name :: Person -> String 

、その後、何1

name :: PetAnimal -> String 

を得るようHaskellは、レコード内のすべてのフィールドにアクセスする関数を定義していることですコンパイラは好きではありません。

名前の一方または両方を変更したり、別のモジュールに入れることができます。

1

タイプクラスは、考慮する可能性がある一般的なインターフェイスを実現する別の方法です。 GHC 8で

data Person = Person { personname :: String -- and some other details 
        } 

data PetAnimal = PetAnimal { petanimalname :: String 
          } 

class HasName a where 
    name :: a -> String 

instance HasName PetAnimal where 
    name = petanimalname 

instance HasName Person where 
    name = personname 
関連する問題