簡體   English   中英

將元素串聯到Haskell中的匿名函數中的列表中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM