gpt4 book ai didi

Haskell 在奇怪的地方抛出解析错误

转载 作者:行者123 更新时间:2023-12-04 16:48:26 24 4
gpt4 key购买 nike

一个玩具示例,但仍然令人沮丧:

numberMapper:: IO ()
numberMapper = do codes <- forM [1 .. 4] (\num ->
do putStrLn $ "Enter a code for " ++ show num
code <- getLine
return code)
let numberCodes = zip [1 .. 4] codes
in forM numberCodes (\(num,code) ->
putStrLn $ "Got code " ++ show code ++ " for " ++ show num)
ghci告诉我我有一个 Parse error in pattern: putStrLn我不明白为什么它应该无法解析。

最佳答案

更正:

numberMapper:: IO ()
numberMapper = do
codes <- forM [1 .. 4] $ \num -> do
putStrLn $ "Enter a code for " ++ show num
getLine
let numberCodes = zip [1 .. 4] codes
forM_ numberCodes $ \(num,code) ->
putStrLn $ "Got code " ++ show code ++ " for " ++ show num

修复: do 内的行块应该排队。
-- wrong
a = do codes <- something
let numberCodes = zip [1..4] codes

-- right
a = do codes <- something
let numberCodes = zip [1..4] codes

修复 2:使用时 let里面 do阻止,不要使用 in .
-- wrong
func = do
let x = 17
in print x

-- right
func = do
let x = 17
print x

修复 3:使用 forM_ (返回 () ,又名 void)而不是 forM (返回一个列表)。
codes <- forM [1..4] func...  -- returns a list
forM_ numberCodes $ ... -- discards list, returns ()

所以 forM_可以(几乎)这样写:
forM_ xs f = do forM xs f
return ()

小改动:你不需要 return这里:
do func1
x <- func2
return x

您可以将其更改为等效的,
do func1
func2 -- value of func2 is returned

关于Haskell 在奇怪的地方抛出解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com