0

私は現在、関数型プログラミングを研究しており、最も重要な機能です。高次関数です。カールとHOFを理解する

現在私が望むほど明瞭ではないので、HOFの仕組みを完全に理解したいと思います。

{- Curried addition. -} 
plusc :: Num a => a -> (a -> a) 
plusc = (+) 

この機能を考慮

は、我々は、この関数はをカリー化を使用し、HOFであることをどの程度までを言うことができますか?

EDITは:基本的に、私は、関数の定義は(パラメータ、結合性、など)

+0

私はあなたが何を求めているのか、何を理解していないのかは分かりません。 – Bergi

+0

私はこの機能がどのように追加を意味するのか分かりません。関数の定義*は、どの程度まで加算を定義しますか? –

+1

加算は '+'演算子によって定義され、 'plusc'が使用します。おそらく 'plusc xy = x + y'や' plusc = \ x - > \ y-> x + y'( 'x + y' ='(+ )xy') – Bergi

答えて

0

HOFは、その引数が上がらないのでplusc、私は希望ではない個人コールほかの略でどのように理解していません機能しません。明らかHOFを発見する方法はが最も左側ではないことを、署名中括弧を探すことです:

{- equivalent signature -} 
plusc :: Num a => a -> a -> a 

我々は、オプションの括弧を削除すると、それは機能がHOFではないことは明らかですそれは機能を取りますが、それはカレーです。

注:すべてのカレー機能するので関数を返し、しかし、我々は、部分的にそれを適用した後、それは関数を返す、とのような機能で動作することを言うかもしれないことができます - それはHOFです。これは概念を記述/学習するのに特に役立つ方法ではないと私は考えていますが、その定義がパラメータと結果の両方に及ぶと思います。

単にグループその引数うuncurriedバージョン:

plusUnc :: Num a => (a, a) -> a 

今すぐHOFはこのような機能を取り、いくつかの他のものにそれを回すかもしれない:

imu :: Num a => (a -> a -> a) -> (a -> a -> a) 
imu f = \a b -> f a b 

注意ラムダインプラントは明らかに簡略化できました。私は単に説明のためにそれを綴りました。

fは、imuに渡される「下位」関数であることに注意してください。これを使用するには:

imuPlus = imu plusc -- a function is being passed 

imuPlus 1 2   -- == 3 

注:我々は両方の概念をミキシングしている(とあなたが両方を求めた)以来、imuもカレーれます。 uncurriedバージョンは、次のようになります。

imuUnc :: ((a -> a -> a), (a, a)) -> a

今では(それはパラメータの機能を持っている)HOFであるが、それは上記の例とは異なり機能を、返しません。 しかし、それがカレー化されているときに使用するほうがずっと簡単ですが、主に部分的なアプリケーションのためです。

+0

高次とは関数が別の関数を返すことを意味することもできますが、これはHaskellのカルト関数にはかなり標準的ですが、 – Bergi

+0

@Bergi oh、okay、*関数を返す*関数をHOFにすることもできます。私はそれをほとんど見ないことはほとんどありませんが、私はそれを編集します。 –

+0

@Bergi Haskellでは、関数を返す関数をHOFと考えることはめったにありませんが、それでもなお適合すると思います。 'Num a =>'制約は暗黙のうちにたくさんの関数を含む辞書を 'plusc'に渡すので、おそらくHOFを' plusc'と呼ぶほうがもっと魅力的です。それでも、私は "HOF"という用語は、もはや今日は役に立たないと考えています。HOFはあまりにも一般的になってきています。 – chi

関連する問題