2016-07-28 24 views
0

私はHaskellで独自の複数のLCM関数を作成しようとしています.1つは指定リストのすべての要素の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)'は自然数よりも単調であるため、 'multLCM = foldr lcm 1'を考慮する必要があります。 –

答えて

2

括弧はHaskellで関数適用を示すものではありません。たとえば、これは同等です。ある

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

、機能lcm引数headxslast、及びxsが得られました。

括弧doは、関数アプリケーションを、引数がでグループ化することで指定できます。

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'が単一の要素リストのために定義され、それが2つの要素リストの通常の' lcm'であることを望みません。この場合、パターンマッチングを行うことはできますか? 'x:y:xs'のようなものでしょうか? –

+1

なぜですか?私は単一の要素リストのためにmultiLCMを定義しないという十分な理由は考えられません。 – ErikR