2017-09-04 8 views
1

私はHaskellのを学ぶが、一つのことに捕まってしまった:学習Haskellの構文

add 0 = id 
add x = add(x-1) . (+1) 

この関数は、最初の引数に1を加算し、第二引数から1を減算することにより、別の引数を追加します。

*Main> add 4 2 
6 

しかし、どのように動作するのか分かりません。誰かが 'add'の後に2つの数字を書いている理由を説明することができます(それは1つのパラメータ 'x'でのみ記述されます)。 2番目の行に「(+1)」と表示されています。

ありがとうございました!

UPD:もう一度すべての答えてくれてありがとう!今、私はそれがどのように動作するかを理解する:)

答えて

7

ハスケルのすべての機能は、彼らが実際に一つだけのパラメータを取ることを意味し、カリー化されています。機能は、実際に何が起こっているのかf a bのような2つのパラメータを取るとき(f a) bです:f aはその後bに適用される関数を返しています。

のでadd 4add(3) . (+1)と同じです。 (+1)は、入力を受け取り、その入力に1を加える関数の構文です。 .は、関数を構成する方法です。(f . g) xf (g x)と同じです。したがって、add(3) . (+1)は最初に引数に1を加えて、結果としてadd(3)を呼び出します。

add(3)は次にadd(2) . (+1)に拡張され、これはidに評価add 0まで再帰的に継続します。 idは恒等関数で、渡すものを返すだけです。従ってadd 0 xid xxです。

+6

はい。 'f(x)'スタイル関数のアプリケーションを書いてはいけません。数値引数でもないので、混乱を避けてください。 – leftaroundabout

5

私はアレックの答えが好きです。通常、これらのタイプのコードが表示されたら、私はこれらのステップで を操作します。オリジナルコード:

add 0 = id 
add x = add(x-1) . (+1) 

のは、はるかに簡単にフォームにそれを翻訳してみましょう:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = add (num1 - 1) . (\num2 -> num2 + 1) 

はもっと簡単に翻訳:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = \num3 -> add (num1 - 1) ((\num2 -> num2 + 1) num3) 

別の変換:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 = \num3 -> add (num1 - 1) (num3 + 1) 

決勝変換:

add :: Int -> Int -> Int 
add 0 num = id num 
add num1 num3 = add (num1 - 1) (num3 + 1) 

.関数合成作用素です。 (+1)は、特殊構文 であり、\x -> x + 1を表します。