约束错误中的非类型变量参数,同时使用 with infix
Non type-variable argument in the constraint error, while using with infix
不幸的是,我遇到了一个奇怪的错误。它发生在对数据构造函数使用中缀时。
我是 Haskell 的新手。任何人都可以在这方面帮助我吗?
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>
您要做的是使用中缀运算符编写以下 Cons 10 (Cons 10 Emp)
。
当您使用反引号 (`) 对普通函数进行中缀时,中缀运算符是左关联的。这意味着:
λ> 10 `Cons` 10 `Cons` Emp
会括号如下:
λ> ((10 `Cons` 10) `Cons` Emp)
虽然你希望它是:
λ> 10 `Cons` ( 10 `Cons` Emp)
因为等于Cons 10 (Cons 10 Emp)
。
这当然是右结合的,因此您需要明确地将其括起来。
Markus Mayr 链接了引用 Haskell 报告的 QA。
您可以将数据构造函数定义为右关联,
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)
不幸的是,我遇到了一个奇怪的错误。它发生在对数据构造函数使用中缀时。
我是 Haskell 的新手。任何人都可以在这方面帮助我吗?
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>
您要做的是使用中缀运算符编写以下 Cons 10 (Cons 10 Emp)
。
当您使用反引号 (`) 对普通函数进行中缀时,中缀运算符是左关联的。这意味着:
λ> 10 `Cons` 10 `Cons` Emp
会括号如下:
λ> ((10 `Cons` 10) `Cons` Emp)
虽然你希望它是:
λ> 10 `Cons` ( 10 `Cons` Emp)
因为等于Cons 10 (Cons 10 Emp)
。
这当然是右结合的,因此您需要明确地将其括起来。
Markus Mayr 链接了引用 Haskell 报告的 QA。
您可以将数据构造函数定义为右关联,
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)