2016-05-01 10 views
0

私は過去2時間にわたり、Haskellのカリングについて読んできましたが、複数のパラメータを持つ関数が実際に他の関数をどのように返しているのか、その定義はどうなっているのでしょうか? 。Haskell Currying

私たちは機能を定義してみましょう:

myFunc :: (Num a) => a -> a -> a 
myFunc x y = x * 2 + x * y 

:t (myFunc 2)印刷Num a => a -> a、数をとり、また数を出力する、すなわち機能。しかし、(myFunc 2)によって返される関数の定義はどのように見えますか?コンパイラはのようになり、定義内でxを置き換えますか?

再帰処理はどのように処理されますか?私は、関数を定義した場合

replicate' :: (Integral i, Ord i) => i -> a -> [a] 
replicate' n x 
    | n <= 0 = [] 
    | otherwise = x : replicate' (n - 1) x 

、どのような関数は、コンテキスト(replicate 3) 'a'(replicate' 3)によって返されますか?

答えて

4

これは、明示的にカリー化形式で定義replicate'です:

replicate' :: (Integral i, Ord i) => i -> (a -> [a]) 
replicate' n 
    | n <= 0  = const [] 
    | otherwise = \x -> x : replicate' (n - 1) x 

それでは、replicate' 3はそれだけで定義されていた場合だけ

\x -> x : replicate' 2 x 

で表現

if 3 <= 0 then const [] 
       else \x -> x : replicate' 2 x 

に評価“暗黙のカリー化実際にあなたが単に

\x -> if 3 <= 0 then const [] 
        else \x -> x : replicate' 2 x 
+0

あなたは '\ x - > x:replicate '2 x'は何を意味するのかを教えてください。また、私が推測したように、コンパイラは 'myFunc'を扱いますか? –

+1

ええと、ラムダ関数の仕組みは分かりますよね?さもなければ、これはそれらを読んでよい時間であり、彼らは非常に重要である。 – leftaroundabout

4

私はあなたが最初のものは

を取る関数を変換
     ------currying-----> 
     f :: (a,b) -> c      f' :: a -> b -> c 
         <----uncurrying----- 

ある

  • 部分関数適用
  • をカリー化別物

    • を混合していると思います引数のタプル whi chは、2つのものの1つの引数を意味し、1つの引数をとり関数を生成する関数になります。

      線形代数に精通していれば、これは他の線形関数を生成する線形関数として双線形関数を非常によく似ています。

      部分的な機能の適用は、明示的な親子化の結果に過ぎません。

      f :: a -> b -> c 
      

      は本当に

      f :: a -> (b -> c) 
      

      少なくとも関数を定義するのHaskellのやり方です。

    +0

    で終わるかもしれので、コンパイラはしてもしなくてもよい、結合xのうち、n <= 0条件を引き出すことがよろしいですか? Wikipediaによると、「カリングとは、複数の引数(または引数の組)を引数とする関数の評価を、引数が1つの関数の順序を評価するために変換する技法であり、(https:// wiki .haskell.org/Partial_application)では、部分関数アプリケーションは、 'func = replicate 3'のような関数を作成するときです。これは' replicate'に1つの引数しか与えません。 'func var'を呼び出すと、varが3回複製されます。 –

    +0

    @RazvanMeriniucあなたが引用しているウィキペディアの記事に基づいて、私の答えのどの部分に同意していませんか? – epsilonhalbe

    +0

    curryingは、タプルだけでなく複数の引数も変換します。 2番目の例もcurryingであり、前に説明したコンテキストで部分関数アプリケーションが表示されます。 –