これを理解するのは難しいです。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