相关疑难解决方法(0)

runST和函数组合

为什么这个类型检查:

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 function-composition

53
推荐指数
2
解决办法
3254
查看次数

在Haskell中,为什么我需要在我的阻止之前放一个$?

[这个问题是由"真实世界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)

haskell

11
推荐指数
3
解决办法
583
查看次数

标签 统计

haskell ×2

function-composition ×1