为什么这个类型检查:
runST $ return $ True
Run Code Online (Sandbox Code Playgroud)
虽然以下不是:
runST . return $ True
Run Code Online (Sandbox Code Playgroud)
GHCI抱怨:
Couldn't match expected type `forall s. ST s c0'
with actual type `m0 a0'
Expected type: a0 -> forall s. ST s c0
Actual type: a0 -> m0 a0
In the second argument of `(.)', namely `return'
In the expression: runST . return
Run Code Online (Sandbox Code Playgroud) [这个问题是由"真实世界Haskell"中的第9章推动的]
这是一个简单的功能(减少到必需品):
saferOpenFile path = handle (\_ -> return Nothing) $ do
h <- openFile path ReadMode
return (Just h)
Run Code Online (Sandbox Code Playgroud)
我为什么需要那个$?
如果要处理的第二个参数不是do块,我不需要它.以下工作正常:
handle (\_ -> putStrLn "Error calculating result") (print x)
Run Code Online (Sandbox Code Playgroud)
当我尝试删除$编译失败.如果我明确添加parens,我可以让它工作,即
saferOpenFile path = handle (\_ -> return Nothing) (do
h <- openFile path ReadMode
return (Just h))
Run Code Online (Sandbox Code Playgroud)
我可以理解这一点,但我想我希望当Haskell击中do它时应该想到"我正在开始阻止",我们不应该明确地把它放在$那里来解决问题.
我还想过将do块推到下一行,如下所示:
saferOpenFile path = handle (\_ -> return Nothing)
do
h <- openFile path ReadMode
return (Just h)
Run Code Online (Sandbox Code Playgroud)
但是如果没有parens也行不通.这让我感到困惑,因为以下工作:
add a b …Run Code Online (Sandbox Code Playgroud)