Haskell-functor

提供:Dev Guides
移動先:案内検索

ハスケル-ファンクター

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

  • ファンクター*は、次のような関数定義を持つ組み込みクラスです-
class Functor f where
   fmap :: (a -> b) -> f a -> f b

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

次の例では、Haskell Functorの動作を確認します。

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]

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

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

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

Just 17
Nothing

Applicative Functor

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

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

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

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

実装によると、2つのメソッド "Pure" および* "<*>" *を使用して別のFunctorをマップできます。 「Pure」メソッドは任意のタイプの値を取る必要があり、常にその値のApplicative Functorを返します。

次の例は、Applicative Functorの仕組みを示しています-

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 です。

*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} はモノイドの完全な例です。