1

Haskellでこのようなことができるかどうか疑問に思っていました

data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = Noun | Det Noun

私がこれについて間違っているとしたら、私が言おうとしているのは、「単語」は「Det」、「Adj」、「名詞」などのいずれかであり、「NounPhrase」は「名詞」または「名詞」です。 「Det」の後に「名詞」が続きます。

これを行おうとすると、「未定義の型コンストラクター "名詞"」というエラーが表示されます。

上記のように実行するにはどうすればよいですか。

4

2 に答える 2

4

次のような代数データ型を定義すると

データ MyType = Con1 文字列 | Con2 Int

thenCon1およびCon2は、それ自体が関数およびであるデータ コンストラクターです。あなたの例には2つの問題があります:Con1 :: String -> MyTypeCon2 :: Int -> MyType

  1. 異なる型に同じデータ コンストラクターを使用しています。データ コンストラクターは特定の型の値を生成する関数であるため、に対して同じデータ コンストラクター (DetおよびNoun) を使用することはできません。したがって、 のコンストラクターには別の名前を選択する必要があります 。Word NounPhraseNounPhrase
  2. Det NounNounはデータ コンストラクターであるため意味がありませんが、 の引数はDet型である必要があります (例: String.

Haskell のコンストラクターを参照して、問題を解決してください。

于 2012-12-17T05:02:34.357 に答える
2

型と値のコンストラクターを混同しています。あなたが言う時

data Word = Det String | Adj String | Noun String | Verb String | Adverb String

たとえば、タイプ をいくつかのフォームの 1 つとして定義します。Word

Det String

Detそれは、を受け取り、type の値を返すコンストラクタであると言います。タイプではなく Word のコンストラクターとして定義されている場合も同様です。StringWordNoun

Haskell で必要なものをエンコードするには、さまざまな方法があります。最も簡単なのは使用することです

data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = JustNoun String | Compound String String

これが「Haskell を学ぶ」方法です。「stringly typed」ですが、おそらく目的には十分です。

于 2012-12-17T04:41:18.567 に答える