回答編集履歴
1
書き掛けを投稿してしまった
test
CHANGED
@@ -16,7 +16,19 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
+
```haskell
|
20
|
+
|
21
|
+
-- この2つは等価
|
22
|
+
|
23
|
+
apply f x = f x
|
24
|
+
|
25
|
+
apply = \f -> (\x -> f x)
|
26
|
+
|
27
|
+
```
|
28
|
+
|
29
|
+
|
30
|
+
|
19
|
-
ここで型の値の定義を合わせて見てみます。
|
31
|
+
ここで型の値の定義を照らし合わせて見てみます。
|
20
32
|
|
21
33
|
|
22
34
|
|
@@ -26,4 +38,62 @@
|
|
26
38
|
|
27
39
|
|
28
40
|
|
29
|
-
値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。
|
41
|
+
値と型の組は、「f」と「a 型の値を取って b 型の値を返す関数型」が組、同じように「x を取って f x を返す関数」と「a 型の値を取って b 型の値を返す関数型」が組となります。Haskell の記法で書くと次のようになります。
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
```haskell
|
46
|
+
|
47
|
+
-- 「f」の型は「a 型の値を取って b 型の値を返す関数型」
|
48
|
+
|
49
|
+
f :: a -> b
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
-- 「x を取って f x を返す関数」の型は「a 型の値を取って b 型の値を返す関数型」
|
54
|
+
|
55
|
+
\x -> f x :: a -> b
|
56
|
+
|
57
|
+
```
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
`\x -> f x :: a -> b` を同じように読み解いていくと下記のようになります。
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
```haskell
|
66
|
+
|
67
|
+
-- 「x」の型は「a」
|
68
|
+
|
69
|
+
x :: a
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
-- 「f x」の型は「b」
|
74
|
+
|
75
|
+
f x :: b
|
76
|
+
|
77
|
+
```
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
ここまでで説明は終わりです。
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
----
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
おまけとして apply を TypeScript で書いてみます([Wandbox で実行](https://wandbox.org/permlink/Bm2NoHUcelHbSB8h))。
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
```typescript
|
94
|
+
|
95
|
+
const apply: <A, B>(f: (A) => B) => ((x: A) => B) =
|
96
|
+
|
97
|
+
function<A, B>(f: (A) => B) { return function(x: A) { return f(x); } };
|
98
|
+
|
99
|
+
```
|