Haskell-functor
ハスケル-ファンクター
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]
次に、 map と fmap の違いは何ですか?違いはそれらの使用法にあります。 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} はモノイドの完全な例です。