2017-08-26 22 views
0

人のグループに関する情報を格納するデータ型を作成しました。生年月日。データ型は単純に3タプルの2つのリストで、最初のリストは(first, middle, last)の名前を保持し、2番目のリストはDOB(Day、Month、Year)を保持します。それはの名前を返しますので、予想されるタイプ 'x'を実際のタイプ `([Char]、[Char]、[Char]) 'と一致させることができませんでした。

data Names = Names [(String, String, String)] 
data People = People Names 

私は、最初のリストを作成する関数を記述しようとしている:あなたは、以下のデータ型が(それはこの質問には無関係ですので、私はDOBタイプを省略しました)見ることができます最初の人とその後Peopleのリスト。ここでは、これまでのところです:これは、今

error: 
* Couldn't match expected type `Names' 
    with actual type `([Char], [Char], [Char])' 
* In the first argument of `People', namely `("Bob", "Alice", "George")' 
    In the first argument of `(:)', namely 
    `People ("Bob", "Alice", "George")' 
    In the expression: People ("Bob", "Alice", "George") : [] 

になりハスケルの私の知識では、私は Stringがちょうど [Char]であると考え

initiallist :: ([String], People) 
initiallist = (first_name, all_people) 
    where first_name = "Bob" : "Alice" : "George" : [] 
     all_people = People ("Bob","Alice","George") : [] 

。だから私は自分のコードがうまくいくと思ったが、それは私には絶対に困惑していた。

答えて

1

コードには2つの問題があります。

最初はPeopleデータ型はNamesデータ型を受け取りますが、[(String,String,String)]データ型でフィードしようとしています。

値コンストラクタの優先順位は(ここではPeopleおよび/またはNames)@ Koterpillarの答えで述べたように、第2は、あるはリスト値のコンストラクタ:(左協会)よりも高くなっています。

もう1つのポイントは、より効率的なコードを生成するnewtypeによって定義できるデータ型です。

値コンストラクタも関数であることを念頭に置いて、:コンストラクタを使用してリストを作成する場合は、好きかもしれません。

newtype Names = Names [(String, String, String)] 
newtype People = People Names 

initiallist :: ([String], People) 
initiallist = (first_name, all_people) 
    where first_name = "Bob" : "Alice" : "George" : [] 
      all_people = People $ Names $ ("Bob","Alice","George") : [] 

またはコースのあなたは、好ましくは

all_people = People (Names [("Bob","Alice","George")]) 
のように行うことができます
3

:オペレータは、Peopleコンストラクタを適用するより優先度が低くなります。だからあなたの表現は、実際には次のとおりです。

all_people = (People ("Bob","Alice","George")) : [] 

それは何Peopleコンストラクタが適用なかったと言って、エラーメッセージに示されている:あなたはそれを明示的に確認する必要があります

...first argument of `People', namely `("Bob", "Alice", "George")' 

all_people = People (("Bob","Alice","George")) : []) 

またはリスト表記:

all_people = People [("Bob","Alice","George")] 
関連する問題