質問するログイン新規登録

回答編集履歴

1

書き掛けを投稿してしまった

2021/08/03 00:02

投稿

kakkun61
kakkun61

スコア285

answer CHANGED
@@ -7,9 +7,44 @@
7
7
 
8
8
  `apply f x = f x` これは `apply = \f -> (\x -> f x)` と等価です。これを読むと『apply は「f を取って「x を取って f x を返す関数」を返す関数」である』となります。
9
9
 
10
+ ```haskell
11
+ -- この2つは等価
10
- ここで型の値の定義を合わせて見てみます。
12
+ apply f x = f x
13
+ apply = \f -> (\x -> f x)
14
+ ```
11
15
 
16
+ ここで型の値の定義を照らし合わせて見てみます。
17
+
12
18
  > 型:「a 型の値を取って b 型の値を返す関数型」の値を取って「a 型の値を取って b 型の値を返す関数型」の値を返す関数型
13
19
  > 値:f を取って「x を取って f x を返す関数」を返す関数
14
20
 
15
- 値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。
21
+ 値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。Haskell の記法で書くと次のようになります。
22
+
23
+ ```haskell
24
+ -- 「f」の型は「a 型の値を取って b 型の値を返す関数型」
25
+ f :: a -> b
26
+
27
+ -- 「x を取って f x を返す関数」の型は「a 型の値を取って b 型の値を返す関数型」
28
+ \x -> f x :: a -> b
29
+ ```
30
+
31
+ `\x -> f x :: a -> b` を同じように読み解いていくと下記のようになります。
32
+
33
+ ```haskell
34
+ -- 「x」の型は「a」
35
+ x :: a
36
+
37
+ -- 「f x」の型は「b」
38
+ f x :: b
39
+ ```
40
+
41
+ ここまでで説明は終わりです。
42
+
43
+ ----
44
+
45
+ おまけとして apply を TypeScript で書いてみます([Wandbox で実行](https://wandbox.org/permlink/Bm2NoHUcelHbSB8h))。
46
+
47
+ ```typescript
48
+ const apply: <A, B>(f: (A) => B) => ((x: A) => B) =
49
+ function<A, B>(f: (A) => B) { return function(x: A) { return f(x); } };
50
+ ```