【问题标题】:Use custom data type to define new data type in haskell使用自定义数据类型在haskell中定义新的数据类型
【发布时间】:2015-11-19 21:42:50
【问题描述】:

我想知道是否有可能在 Haskell 中做这样的事情

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

如果我说错了,我想说的是 - “单词”是“Det”、“Adj”、“名词”等,而“NounPhrase”是“名词” " 或 "Det" 后跟 "Noun"。

当我尝试这样做时,我收到错误:“未定义的类型构造函数“名词””

我怎样才能做到这一点,使其按上述方式执行。

【问题讨论】:

    标签: parsing haskell types


    【解决方案1】:

    定义代数数据类型时 喜欢

    数据 MyType = Con1 字符串 | Con2 Int

    那么Con1Con2数据构造函数,它们本身就是 函数Con1 :: String -> MyTypeCon2 :: Int -> MyType。 你的例子有两个问题:

    1. 您对不同类型使用相同的数据构造函数。由于数据 构造函数是产生特定类型值的函数,你不能使用 Word 使用相同的数据构造函数(DetNoun 用于 NounPhrase。 所以你需要为构造函数选择不同的名字 NounPhrase
    2. Det Noun 没有意义,因为 Noun 是一个数据 构造函数,而Det 的参数需要是一个类型,例如String

    请参阅Constructors in Haskell 以帮助解决问题。

    【讨论】:

      【解决方案2】:

      您混淆了类型和值构造函数。当你说

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

      您将 type 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”的方式。它是“字符串类型的”,但可能足以满足您的目的。

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2014-08-05
        相关资源
        最近更新 更多