回答編集履歴
1
書き掛けを投稿してしまった
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
|
+
```
|