我写了以下内容:
data Expression = Expression { lhs :: Int, rhs :: Expression } | Int
问题是,如果我尝试仅使用 int 构建表达式,则会得到部分应用的函数。解决这个问题的最佳方法是什么?
最佳答案
预先知道的事情:
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/