do記法における「<-」バインディング 質問する

do記法における「<-」バインディング 質問する

これを理解するのは難しいです。do 記法で書く場合、次の 2 行はどのように異なりますか?

1. let x = expression
2. x <- expression

わかりません。 片方が機能する場合もあれば、もう片方が機能する場合もあります。 しかし、両方機能することはまれです。 「Learn you a haskell」には、<-が右側を左側のシンボルにバインドすると書かれています。 しかし、xで単純に定義することとどう違うのでしょうかlet

ベストアンサー1

<-はモナドから値を抽出しますが、let文は抽出しません。

import Data.Typeable

readInt :: String -> IO Int
readInt s = do
  putStrLn $ "Enter value for " ++ s ++ ": "
  readLn

main = do
  x <- readInt "x"
  let y = readInt "y"
  putStrLn $ "x :: " ++ show (typeOf x)
  putStrLn $ "y :: " ++ show (typeOf y)

実行すると、モナドアクションreadInt "x"がステートメントによって実行されるため、プログラムは x の値を要求します。 は評価されますが、結果として生じるモナドアクションは実行されないため<-、 y の値は要求されません。readInt "y"

x の値を入力してください: 
123
x :: 整数
y :: IO 整数

なのでx :: Int、普通のことはできますInt

putStrLn $ "x = " ++ show x
putStrLn $ "x * 2 = " ++ show (x * 2)

なのでy :: IO Int、それが正規の であると主張することはできませんInt

putStrLn $ "y = " ++ show y -- ERROR
putStrLn $ "y * 2 = " ++ show (y * 2) -- ERROR

おすすめ記事