haskell - 您可以将记录语法与 Haskell 数据类型中的枚举混合使用吗?

标签 haskell functional-programming

我写了以下内容:

data Expression = Expression { lhs :: Int, rhs :: Expression } | Int

问题是,如果我尝试仅用一个 int 构建一个表达式,我就会得到一个部分应用的函数。解决此问题的最佳方法是什么?

最佳答案

预先知道的事情:

  • Haskell 中的每个数据构造函数 data声明有自己的名字
  • 数据构造函数位于与类型名称完全独立的命名空间中


  • 正如评论所指出的,您正在定义一个名为 Expression 的类型。和一个名为 Expression 的数据构造函数.因为 Haskell 对类型和数据构造函数有单独的命名空间,所以编译器对此没有问题。

    此外,您正在创建名为 Int 的第二个数据构造函数。 (这同样与名为 Int 的现有类型不冲突)。这可能不是您想要的,并且启动起来很困惑!

    当您尝试构造一个值时,例如 myExpr = Expression x y ,您使用的是第一个数据构造函数,而不是类型名称或第二个数据构造函数。 Expression数据构造函数需要两个参数:第一个是 Int ,然后是 Expression .这就是为什么,如果你只提供第一个参数,你将得到一个部分应用的函数。

    您的示例的更正,更惯用的版本可能是:
    data Expression = Assignment { lhs :: Int, rhs :: Expression }
                    | Literal { value :: Int }
    

    如果数据构造函数是唯一的数据构造函数,那么看到与其类型同名的数据构造函数实际上是相当普遍的:
    data Foo = Foo { unwrapFoo :: Int }
    

    关于haskell - 您可以将记录语法与 Haskell 数据类型中的枚举混合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724701/

    相关文章:

    haskell - 快速、优化的 UTF8 编码解码

    haskell - 无法从 Haskell 元组获取第一个值

    swift - 将 [Future<Object,Error>] 转换为 Future<[Object],Error>

    haskell - Monad 作为附加词

    haskell - Haskell 的图形和网络库

    haskell - curry 是通用构造的因式分解器

    concurrency - INRIA会向OCaml添加并发原语吗?

    functional-programming - 方案中没有整数的余数

    scala - 如何使用 Name 作为应用程序?

    haskell - IO 和 Maybe monad 交互