2016-07-28 82 views
0

我想在Haskell中編寫自己的多重LCM函數,它計算給定列表中所有元素的LCM。我試圖使用屬性lcm(a,b,c)= lcm(a,lcm(b,c))使其遞歸。這是我迄今爲止所能想到的,但它給了我一些我無法理解的錯誤。在Haskell中遞歸實現LCM

multLCM xs 
    | length(xs) == 2 = lcm head(xs) last(xs) 
    | length(xs) > 2 = lcm head(xs) multLCM(drop 1 xs) 

有人可以幫我改進這個功能嗎?

非常感謝!

+3

完全避開語法問題:因爲'(lcm,1)'在自然數上形成一個monoid,所以應該考慮'multLCM = foldr lcm 1'。 –

回答

2

括號不表示在Haskell功能應用。例如,這些是等同的。

lcm head(xs) last(xs) 
lcm head xs last xs 

也就是說,功能lcm提供的參數headxslastxs

括號允許您通過分組與它的參數的功能,以指定功能應用

lcm (head xs) (last xs) 
+0

哦,非常感謝!它現在有效! –

+0

您可以讓我知道何時可以使用'$'和'.'來代替圓括號嗎?我總是發現,令人困惑 –

+0

@KoundinyaVajjha你見過[這個答案](http://stackoverflow.com/questions/940382/haskell-difference-between-dot-and-dollar-sign#1290727)? –

0

你應該使用模式匹配來解構名單:

multiLCM (x:xs) = lcm x (multiLCM xs) 
multiLCM [x] = ??? 
+0

我不確定如何填寫答案。我不希望我的'multiLCM'被定義爲單個元素列表,並且希望它只是兩個元素列表通常的'lcm'。在這種情況下可以進行模式匹配嗎?可能是'x:y:xs'嗎? –

+1

爲什麼?我想不出有什麼好的理由不爲單個元素列表定義multiLCM。 – ErikR