2017-05-08 90 views
0

我來自Python,對我來說很難學習Haskell。例如,我得到這個函數將合併列表。所以第一件事是合併列表,然後我想返回合併列表的總和。如何正確的語法?如何在此Haskell列表函數中執行多個操作?

merge:: [[a]] -> [a] 
merge xss = foldr (++) [] xss 
      return sum [] 

這段代碼只有在刪除最後一行時纔有效。但是我想返回合併列表的總和。

+0

您可以從兩個單獨的函數構建它:第一個實際上合併,第二個合併。但是,將這些(通過「合成」)結合起來應該以功能的方式完成:'f(g(x))'作爲數學函數,或者在Haskell中'f g x'。請注意,總和的類型不是'[a]',而是'a',並且'return'並不意味着您認爲它在Haskell中意味着什麼。 –

+1

也,'返回'是不是你在Haskell。 – karakfa

+2

['return'](http://stackoverflow.com/questions/15323927/whats-so-special-about-return-keyword)並不意味着你的想法 – jkeuhlen

回答

6

現在你唯一得到的是一個編譯時錯誤,抱怨在你的代碼的多個錯誤 - 我想,最好的辦法是閱讀一些關於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 
+0

在你的第三段代碼中,你缺少了'在' – bwroga

+0

thx - 修好了! – epsilonhalbe

1

要撥打foldr一些參數,然後調用sum結果爲foldr

您可以通過書面形式,很容易:

merge xss = sum (foldr (++) [] xss) 

你並不需要寫多個「聲明」。

+0

(我知道有很多建議的現有答案;但是,這些都沒有直接顯示提問者如何編寫他/她似乎試圖編寫的代碼,而沒有任何其他更改) – immibis

相關問題