[英]Concatenating elements into a list in a anonymous function in Haskell
我是Haskell的新手,似乎無法找到無法編譯此代碼的原因:
test = foldr (\x y -> y : x) [1]
我沒有嘗試在虛擬功能“測試”上實現任何功能。
只是我不斷收到此錯誤代碼:
Occurs check: cannot construct the infinite type: a0 = [a0]
In the first argument of `(:)', namely `y'
In the expression: y : x
In the first argument of `foldr', namely `(\ x y -> y : x)'
我要做的就是能夠連接列表中的元素,以在另一個函數中定義的匿名函數(在本例中為“ test”中定義)內形成另一個列表。
謝謝。
文件foldr
的類型是
foldr :: (a -> b -> b) -> b -> [a] -> b
所以如果我們嘗試使用它
test = foldr (\x y -> y : x) [1]
我們必須具有以下類型:
b = Num n => [n]
因為空輸入列表的參數具有該類型,並且
(\x y -> y : x) :: (a -> b -> b)
:: Num n => (a -> [n] -> [n])
但是lambda是flip (:)
,因此具有類型
(\x y -> y : x) :: [t] -> t -> [t]
並嘗試使用a -> [n] -> [n]
統一它,我們發現
a == [t]
t == [n]
[t] == [n]
這意味着t == [t]
。
如果您不flip
缺點(:)
,它將進行類型檢查,但該函數將更容易表示為
test xs = xs ++ [1]
或,無積分
test = (++ [1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.