2017-04-18 19 views
0

私は通常、人々がmapfold、またはbindを話しているときには、持ち上げの言葉を聞いていますが、基本的にすべての高次関数は何らかのリフティングをしていませんか?持ち上げ機能と高次機能の違い

はなぜfilterは一体、a -> Boolから[a] -> [a]a -> aからBool -> aにリフト考えることができる(モデルAN if文)でもbool機能リフトすることはできません。そうでない場合、Applicativeタイプのクラスのapがエレベーターと考えられるのはなぜですか?

重要なことは、... a ...から... f a ...に行くされている場合は、apは、いずれの場合に合わないでしょう:f (a -> b) -> f a -> f b

答えて

2

私は誰もがすでにこのに答えていない驚いています。

リフティング関数の役割は、関数をコンテキスト(通常はFunctorまたはMonad)に持ち上げることです。したがって、タイプa -> bの関数をListコンテキストに持ち上げると、タイプがList[a] -> List[b]になります。あなたがそれについて考えるなら、これはちょうどmap(またはHaskellのfmap)がするものです。実際、それはFunctorの定義の一部です。

ただし、Functorは1つの引数の関数しか持ち上げることができません。我々はまた、他のアリーティの機能にも対処できるようにしたい。たとえば、タイプがa -> b -> cの場合、mapは使用できません。これはより一般的な持ち上げ操作が画像に入る場所です。 Haskellで我々は、この場合のlift2を有する:

M[a]
lift2:: (a -> b -> c) -> (M[a] -> M[b] -> M[c]) 

が所与のタイプaでパラメータいくつかの特定のモナド(List等)です。

liftの追加の変種が他のアライテスについても定義されています。

この理由は、filterが必要なタイプの署名に適合しないため、リフティング機能ではありません。タイプa -> boolからM[a] -> M[bool]に機能を持ち上げていません。しかし、それはより高次の関数です。

ハスケルWikiを持ち上げる方法の詳細については、good article on it

関連する問題