我來自Python,對我來說很難學習Haskell。例如,我得到這個函數將合併列表。所以第一件事是合併列表,然後我想返回合併列表的總和。如何正確的語法?如何在此Haskell列表函數中執行多個操作?
merge:: [[a]] -> [a]
merge xss = foldr (++) [] xss
return sum []
這段代碼只有在刪除最後一行時纔有效。但是我想返回合併列表的總和。
我來自Python,對我來說很難學習Haskell。例如,我得到這個函數將合併列表。所以第一件事是合併列表,然後我想返回合併列表的總和。如何正確的語法?如何在此Haskell列表函數中執行多個操作?
merge:: [[a]] -> [a]
merge xss = foldr (++) [] xss
return sum []
這段代碼只有在刪除最後一行時纔有效。但是我想返回合併列表的總和。
現在你唯一得到的是一個編譯時錯誤,抱怨在你的代碼的多個錯誤 - 我想,最好的辦法是閱讀一些關於Haskell語法(如http://learnyouahaskell.com)
merge :: [[a]] -> [a]
你必須添加一個typeclass約束,所以你可以添加一個列表的元素 - 現在你說你的函數可以處理所有可能的元素,你可以想象得到。
merge:: Num a => [[a]] -> [a]
總結「合併」之後,如果要像開始一樣寫入中間變量,則必須聲明中間變量。
merge xss = let tmp = foldr (++) [] xss
in sum tmp
,或者你可以把它寫短一點
merge xs = sum $ concat xs
或pointfree如果你想更短
merge = sum . concat
在你的第三段代碼中,你缺少了'在' – bwroga
thx - 修好了! – epsilonhalbe
要撥打foldr
一些參數,然後調用sum
結果爲foldr
。
您可以通過書面形式,很容易:
merge xss = sum (foldr (++) [] xss)
你並不需要寫多個「聲明」。
(我知道有很多建議的現有答案;但是,這些都沒有直接顯示提問者如何編寫他/她似乎試圖編寫的代碼,而沒有任何其他更改) – immibis
您可以從兩個單獨的函數構建它:第一個實際上合併,第二個合併。但是,將這些(通過「合成」)結合起來應該以功能的方式完成:'f(g(x))'作爲數學函數,或者在Haskell中'f g x'。請注意,總和的類型不是'[a]',而是'a',並且'return'並不意味着您認爲它在Haskell中意味着什麼。 –
也,'返回'是不是你在Haskell。 – karakfa
['return'](http://stackoverflow.com/questions/15323927/whats-so-special-about-return-keyword)並不意味着你的想法 – jkeuhlen