与infix一起使用时,约束中的非类型变量参数出错



不幸的是,我遇到了一个奇怪的错误。在使用带数据构造函数的infix时会发生这种情况。

我是哈斯克尔的新手。在这方面有人能帮我吗?

Prelude> data L a = Cons a (L a) | Emp deriving Show
Prelude> 10 `Cons` Emp
Cons 10 Emp
Prelude> 10 `Cons` 10 `Cons` Emp
<interactive>:43:1: error:
• Non type-variable argument in the constraint: Num (L a)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a. (Num a, Num (L a)) => L (L a)
Prelude> 10 `Cons` (10 `Cons` Emp) 
Cons 10 (Cons 10 Emp)
Prelude> 10 `Cons` 10 `Cons` Emp
<interactive>:45:1: error:
• Non type-variable argument in the constraint: Num (L a)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a. (Num a, Num (L a)) => L (L a)
Prelude> data L a = Emp | Cons a (L a)  deriving Show
Prelude> 10 `Cons` 10 `Cons` Emp
<interactive>:47:1: error:
• Non type-variable argument in the constraint: Num (L a)
(Use FlexibleContexts to permit this)
• When checking the inferred type
it :: forall a. (Num a, Num (L a)) => L (L a)
Prelude> 

您可以将数据构造函数定义为右关联的,

infixr 5 `Cons`
data L a = Cons a (L a) | Emp deriving Show

然后它会像你预期的那样工作。

main = print $ (21::Int) `Cons` 42 `Cons` Emp
-- => Cons 21 (Cons 42 Emp)

您正在尝试使用中缀运算符编写以下Cons 10 (Cons 10 Emp)

当您使用backticks(`(使普通函数中缀时,中缀运算符是关联的。这意味着:

λ> 10 `Cons` 10 `Cons` Emp

将用括号括起来,如下所示:

λ> ((10 `Cons` 10) `Cons` Emp)

当你希望它是:

λ> 10 `Cons` ( 10 `Cons` Emp)

因为这等于Cons 10 (Cons 10 Emp)

这当然是正确的关联,因此您需要显式地将其括起来

Markus Mayr将引用Haskell报告的QA联系起来。

相关内容

  • 没有找到相关文章

最新更新