我想知道是否有可能在Haskell中做这样的事情
data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = Noun | Det Noun
如果我说错了,我想说的是 - “字”是“Det”,“Adj”,“Noun”等等,而“NounPhrase”是“NounPhrase” “或者”Det“后跟”名词“。
当我尝试这样做时,我收到错误:“未定义的类型构造函数”名词“”
我怎样才能解决这个问题,使其表现如上所述。
答案 0 :(得分:4)
定义代数数据类型时 像
data MyType = Con1 String | Con2 Int
然后Con1
和Con2
是数据构造函数,它们本身就是
函数Con1 :: String -> MyType
和Con2 :: Int -> MyType
。
你的例子有两个问题:
Det
的相同数据构造函数(Noun
和Word
)以及NounPhrase
的。
所以你需要为构造函数选择不同的名称
NounPhrase
。Det Noun
没有意义,因为Noun
是一个数据
构造函数,而Det
的参数需要是一个类型,例如String
。请参阅Constructors in Haskell以帮助澄清问题。
答案 1 :(得分:2)
您将混淆类型和值构造函数。当你说
data Word = Det String | Adj String | Noun String | Verb String | Adverb String
您可以将类型 Word
定义为多种形式之一,例如
Det String
表示Det
是构造函数,它接受String
并返回值Word
的值。 Noun
也是如此,它被定义为Words 的构造函数而不是类型。
您可以通过多种方式在Haskell中编码所需的内容。到目前为止最简单的是使用
data Word = Det String | Adj String | Noun String | Verb String | Adverb String
data NounPhrase = JustNoun String | Compound String String
这是“学习Haskell”的方式。它是“串型”,但可能足以满足您的需要。