I/think/IOモナドを含むdoブロックで変数割当がどのように機能するかという2つの点で、同様の誤解があります。 (1)それは同じ誤解ですか、(2)それをどのようにクリアするか(アンサーで、そして特にあなたがそのテーマについて好きなリファレンスを持っている場合)を理解する助けになりますか?ハスケルIOの割当を結合し分割するdoブロック
私は、すべて1行であれば正常に実行できますが、2つに分割して読みやすくするとできません。
パートI:2
に1行を回すと、なぜこの仕事をしますか?
ipg :: IO()
ipg = do
conn <- connect defaultConnectInfo { connectHost = "0.0.0.0"}
res <- execute conn "INSERT INTO test (num, data) VALUES (?, ?)" $ MyRecord (Just 200) (Just"Test")
print res
しかし、これは
ipg :: IO()
ipg = do
conn <- connect defaultConnectInfo { connectHost = "0.0.0.0" }
q <- "INSERT INTO test (num, data) VALUES (?, ?)" $ MyRecord (Just 200) (Just"Test")
res <- execute conn q
print res
に動作しない私を与える:
Couldn't match expected type ‘IO a0’
with actual type ‘q0 -> IO GHC.Int.Int64’
Probable cause: ‘execute’ is applied to too few arguments
In a stmt of a 'do' block: res <- execute conn q
Qでクエリ部分を保存しようとする第一及び第二のビーイングの違いを。
パートII:1
に2行を回すと、なぜこの仕事ん:
myinput :: IO()
myinput = do
putStrLn "Please input a number."
mynum :: Int <- readLn
print mynum
しかし、これは動作しませんか?
myinput :: IO()
myinput = do
mynum :: Int <- readLn $ putStrLn "Please input a number."
print mynum
は私
execute conn "INSERT INTO test (num, data) VALUES (?, ?)" $ MyRecord (Just 200) (Just "Test")
で
Couldn't match expected type ‘IO() -> IO Int’
with actual type ‘IO a0’
The first argument of ($) takes one argument,
それを手に入れたので、これらは関係のない問題です。最初は、execute関数が4つの引数を取ったことをチェックしていなかったので、私がquery = "myquery {}"にする必要があったpythonの習慣です。実行する(照会する)。 2番目にはシーケンシャルオペレータが必要でした。 mynum :: Int < - (putStrLn "数字を入力してください。")>> readLn)$ thisを使用するよりも、明示的に操作の順序を示すために括弧が必要な場合は、 – Mittenchops