Haskell-ファンクター

FunctorHaskellは、マッピングできるさまざまなタイプの一種の機能表現です。これは、ポリモーフィズムを実装するための高レベルの概念です。Haskellの開発者によると、リスト、マップ、ツリーなどのすべてのタイプはHaskellファンクターのインスタンスです。

A Functor −のような関数定義を持つ組み込みクラスです

class Functor f where 
   fmap :: (a -> b) -> f a -> f b

この定義により、次のように結論付けることができます。 Functor たとえば、関数をとる関数です。 fmap()そして別の関数を返します。上記の例では、fmap() 関数の一般化された表現です map()

次の例では、HaskellFunctorがどのように機能するかを見ていきます。

main = do  
   print(map (subtract 1) [2,4,8,16])      
   print(fmap (subtract 1) [2,4,8,16])

ここでは、両方を使用しました map() そして fmap()減算演算のリストを超えます。両方のステートメントが、要素[1,3,7,15]を含むリストの同じ結果を生成することがわかります。

と呼ばれる別の関数と呼ばれる両方の関数 subtract() 結果を出すために。

[1,3,7,15]
[1,3,7,15]

それでは、違いは何ですか map そして fmap? 違いはそれらの使用法にあります。 Functor 「just」や「Nothing」など、さまざまなデータ型でさらに機能主義者を実装できます。

main = do 
   print (fmap  (+7)(Just 10)) 
   print (fmap  (+7) Nothing)

上記のコードは、端末で次の出力を生成します-

Just 17
Nothing

応用ファンクター

Applicative Functorは、Applicative TypeClassによって提供されるいくつかの追加機能を備えた通常のFunctorです。

Functorを使用して、通常、既存の関数をその内部で定義された別の関数にマップします。ただし、ファンクター内で定義されている関数を別のファンクターにマップする方法はありません。そのため、別の施設がありますApplicative Functor。このマッピング機能は、以下で定義されているApplicativeTypeクラスによって実装されます。Controlモジュール。このクラスでは、2つのメソッドしか使用できません。1つはpure もう1つは <*>

以下は、ApplicativeFunctorのクラス定義です。

class (Functor f) => Applicative f where   
   pure :: a -> f a   
   (<*>) :: f (a -> b) -> f a -> f b

実装によると、2つの方法を使用して別のファンクターをマップできます。 "Pure" そして "<*>"。「純粋」メソッドは任意のタイプの値をとる必要があり、常にその値の適用ファンクターを返します。

次の例は、ApplicativeFunctorがどのように機能するかを示しています-

import Control.Applicative 

f1:: Int -> Int -> Int 
f1 x y = 2*x+y  
main = do  
   print(show $ f1 <$> (Just 1) <*> (Just 2) )

ここでは、関数の関数呼び出しに適用可能なファンクターを実装しました f1。私たちのプログラムは次の出力を生成します。

"Just 4"

モノイド

Haskellがすべてを関数の形で定義していることは誰もが知っています。関数には、入力を関数の出力として取得するオプションがあります。これは何ですかMonoid です。

A Monoidは、出力が入力から独立している関数と演算子のセットです。関数(*)と整数(1)を見てみましょう。これで、入力が何であれ、その出力は同じ数だけになります。つまり、数値に1を掛けると、同じ数値が得られます。

これがモノイドの型クラス定義です。

class Monoid m where  
   mempty :: m 
   mappend :: m -> m -> m  
   mconcat :: [m] -> m 
   mconcat = foldr mappend mempty

HaskellでのMonoidの使用法を理解するには、次の例を見てください。

multi:: Int->Int 
multi x = x * 1 
add :: Int->Int 
add x = x + 0 

main = do  
   print(multi 9)  
   print (add 7)

私たちのコードは次の出力を生成します-

9
7

ここで、関数「multi」は入力に「1」を乗算します。同様に、関数「add」は入力に「0」を追加します。どちらの場合も、出力は入力と同じになります。したがって、関数{(*),1} そして {(+),0} モノイドの完璧な例です。