Skip to content

Commit

Permalink
Explain the example operands of >>=
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Oct 6, 2024
1 parent 9d21979 commit 647d3df
Showing 1 changed file with 11 additions and 13 deletions.
24 changes: 11 additions & 13 deletions assets/19.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,33 +292,33 @@ ghci> :t (>>=) @IO
echo = getLine >>= putStrLn
```

両辺の型を調べてみると
両辺の型を調べてみます:

```
```haskell
ghci> :t getLine
getLine :: IO String
```

左辺に当たる`getLine`が結果として`String`を返して
左辺に当たる命令`getLine`が結果として`String`型の値を返して

```
```haskell
ghci> :t putStrLn
putStrLn :: String -> IO ()
```

右辺に当たる`putStrLn`の引数として渡す
右辺に当たる命令`putStrLn`が引数として`String`型の値を受け取っています`>>=`はこれを`getLine`から受け取って`putStrLn`に渡しているんですね

最終的に`putStrLn`が返すのは`IO ()`なので、`echo`の型は`IO ()`となる。
そして最終的に`putStrLn`が返すのは`IO ()`なので`echo`という命令の型は`IO ()`となります:

```
```haskell
ghci> echo = getLine >>= putStrLn
ghci> :t echo
echo :: IO ()
```

でもこれ↓はダメ
なお`IO`型版の`>>=`の型を`:t (>>=) @IO`で確認したとおり両辺の型は`IO`型でなければならないので例えば次のようなコードは型エラーになります:

```
```haskell
ghci> getLine >>= length

<interactive>:4:13: error:
Expand All @@ -331,11 +331,9 @@ ghci> getLine >>= length
? Relevant bindings include it :: IO b (bound at <interactive>:4:1)
```

あくまでも、`>>=`の右辺に渡されるのは`IO`(命令)を返す関数

`length`のような純粋な関数を`>>=`に渡すには、`return`などで、`IO`に変換しないといけない。
右辺に渡した`length`関数は`Int`返す関数、すなわち`IO`型(命令)ではないので、型エラーになります。この、`length`のような命令を返さない、(純粋な)関数を`>>=`に渡すには、`return`などで、`IO`に変換しないといけないのでご注意ください:

```
```haskell
ghci> getLine >>= return . length
12345 -- ここは自分で入力した行。
5
Expand Down

0 comments on commit 647d3df

Please sign in to comment.