Skip to content

Commit 5be601e

Browse files
committed
Begin to introduce an example of TypeApplications
1 parent d2453b1 commit 5be601e

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

assets/19.md

+18-6
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,29 @@ ghci> :set -XNoTypeApplications
138138

139139
###### `TypeApplications`を使う
140140

141-
```
141+
いよいよ、`TypeApplications`を使ってみましょう:
142+
143+
```haskell
142144
ghci> :set -XTypeApplications
145+
```
146+
147+
ここでは例として、`map`関数に`TypeApplications`を使ってみます:
148+
149+
```haskell
143150
ghci> :t map
144151
map :: (a -> b) -> [a] -> [b]
145-
ghci> map length ["aaa", "bb", "cccc"]
146-
[3,2,4]
147152
```
148153

149-
`map @Bool`と書くことで、`Bool`のリスト専用の`map`ができる
150-
`map :: (a -> b) -> [a] -> [b]`の最初の型引数`a``Bool`を代入するのと同じ意味になる
151-
通常、この、型変数に具体的な型を代入する処理は型推論によってコンパイル時に自動で行われますが、`TypeApplications`を有効にすることで、ユーザー自ら制御できるようになります。
154+
`map`関数は👆の`:t`コマンドの結果の通り`a``b`という二つの型変数を使っています`TypeApplications`を使えばそれぞれの型変数を手動で代入することができます例えば次のように`map @Bool @String`と書くと型変数`a`に`Bool`型変数`b`に`String`を代入した`map`関数が出来上がります:
155+
156+
```haskell
157+
ghci> :t map @Bool @String
158+
map @Bool @String :: (Bool -> String) -> [Bool] -> [String]
159+
```
160+
161+
通常、この、型変数に具体的な型を代入する処理は型推論によってコンパイル時に自動で行われますが、`TypeApplications`を有効にすると、ユーザーが自ら制御できるようになるのです。
162+
163+
`TypeApplications`で作られた`map @Bool @String`は、`Bool`型のリストを受け取って、その各要素に`Bool -> String`関数を適用し、`String`型のリストを返す、専用の関数となっています。そのため、hoge
152164

153165
```
154166
ghci> :t map @Bool

0 commit comments

Comments
 (0)