不幸的是,我遇到了一個奇怪的錯誤。它發生在將中綴與資料建構式一起使用時。
我是 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>
uj5u.com熱心網友回復:
您可以將資料建構式定義為右關聯,
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)
uj5u.com熱心網友回復:
您要做的是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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387023.html
