haskell
1apply :: (a -> b) -> a -> b
2apply f x = f x
まず型の説明からします。(a -> b) -> a -> b
は結合優先度に沿って括弧を補足すると (a -> b) -> (a -> b)
となります。これは『「a 型の値を取って b 型の値を返す関数型」の値を取って「a 型の値を取って b 型の値を返す関数型」の値を返す関数型』です。分かりにくいですが、一旦このままにしておいて値の説明に移ります。その後また型の説明に戻ってきます。
apply f x = f x
これは apply = \f -> (\x -> f x)
と等価です。これを読むと『apply は「f を取って「x を取って f x を返す関数」を返す関数」である』となります。
haskell
1-- この2つは等価
2apply f x = f x
3apply = \f -> (\x -> f x)
ここで型の値の定義を照らし合わせて見てみます。
型:「a 型の値を取って b 型の値を返す関数型」の値を取って「a 型の値を取って b 型の値を返す関数型」の値を返す関数型
値:f を取って「x を取って f x を返す関数」を返す関数
値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。Haskell の記法で書くと次のようになります。
haskell
1-- 「f」の型は「a 型の値を取って b 型の値を返す関数型」
2f :: a -> b
3
4-- 「x を取って f x を返す関数」の型は「a 型の値を取って b 型の値を返す関数型」
5\x -> f x :: a -> b
\x -> f x :: a -> b
を同じように読み解いていくと下記のようになります。
haskell
1-- 「x」の型は「a」
2x :: a
3
4-- 「f x」の型は「b」
5f x :: b
ここまでで説明は終わりです。
おまけとして apply を TypeScript で書いてみます(Wandbox で実行)。
typescript
1const apply: <A, B>(f: (A) => B) => ((x: A) => B) =
2 function<A, B>(f: (A) => B) { return function(x: A) { return f(x); } };
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。