【发布时间】:2019-05-12 12:28:30
【问题描述】:
我正在尝试在 Haskell 中实现没有 Prelude 的布尔值。
当表达式,beq true true "TRUE" "FALSE" 被评估时,没关系。但是当我尝试评估 beq' true true "TRUE" "FALSE" 时,它会因预期类型和实际类型之间的一些差异而失败。
这是代码。
import qualified Prelude as P
i = \x -> x
k = \x y -> x
ki = k i
true = k
false = ki
not = \p -> p false true
beq = \p q -> p (q true false) (q false true)
beq' = \p q -> p q (not q)
所以我检查了论文的推断类型。
*Main> :type beq
beq
:: (t1 -> t1 -> t2)
-> ((p1 -> p1 -> p1) -> (p2 -> p2 -> p2) -> t1) -> t2
*Main> :type beq'
beq'
:: (((p1 -> p2 -> p2) -> (p3 -> p4 -> p3) -> t1) -> t1 -> t2)
-> ((p1 -> p2 -> p2) -> (p3 -> p4 -> p3) -> t1) -> t2
而且不相等。
这里有问题。
我认为它具有相同的类型签名,因为
beq和beq'在折叠和替换时似乎产生相同的结果。就像有很多方法可以实现一个功能一样。但事实并非如此。 Haskell 中是否有一些秘密规则和语法?如果我想用函数
not写beq,我怎样才能让它工作?
【问题讨论】:
-
我不清楚为什么您认为它们应该具有相同的类型,因为它们具有完全不同的实现。也许您应该分享您认为 GHCi 报告错误的类型,以及您认为该类型应该是什么 - 连同您的推理 - 然后我们可以帮助您解释您的错误所在。
标签: haskell type-inference lambda-calculus