为什么单子不能分解?

安东

我不明白为什么我不能分解一个(比如说IO)单子。喜欢IO a -> a吗?

使用happstack和希望得到的,当我的问题起源Text的出ServerPart (Maybe Text)这是由返回(optional $ lookText "domain")然后我记得读过《IO莫纳德》无法逃脱。

我已经读到了unsafePerformIO它的原因以及它不好的原因,但是这些原因似乎都无法回答我的问题。

比克利尔

可以Monad逃脱吗?

是的。这是很容易与许多MonadS,如MaybeEither aStateIdentity,等等。Monad函数中最常见的之一是Monad(->) r如果不可能将一个函数转换为一个值,那么Haskell就不会有太多用处了。

可以IO逃脱吗?

不幸的是。这将是好了很多,对于初学者来说,如果他们没有谷歌四周,看看他们可以从技术上逃避IO使用unsafePerformIO,正如你可能已经猜到了是不是安全并不是要在普通代码中使用,而是在您真正需要它时成为运行时系统的后门。最初,它用于实现一些较低级别的库(例如)Vector,也用于与外部共享库(DLL)进行接口。如果您不编写此类代码,请不要使用unsafePerformIO否则,您将最终获得难以推理和维护的代码,因为它绕过了类型系统。

我们如何逃避其他人Monad

从变化MonadMonad,但大部分单子变压器具有run-eval-exec-方法:

> :m Control.Monad.State
> runState (modify (*10) >> get >>= return . show) 1
("10", 10)
> :type runState (modify (*10) >> get >>= return . show) 1
runState (modify (*10) >> get >>= return . show) 1 :: (String, Int)
> evalState (modify (*10) >> get >>= return . show) 1
"10"
> execState (modify (*10) >> get >>= return . show) 1
10

Maybe Monad有几种方式逃避它:

> :m Data.Maybe
> maybe "nada" show (Just 2)
"2"
> maybe "nada" show Nothing
"nada"
> fromMaybe 1 (Just 10)
10
> fromMaybe 1 Nothing
1
> fromJust (Just 1)
1
> fromJust Nothing
*** Exception: Maybe.fromJust: Nothing

因此,如您所见,并非所有这些都可以安全使用。

这与Happstack有什么关系?

我不知道,我还没有足够使用Happstack来了解它。但是,通过快速搜索,我在他们的网站上找到了示例示例似乎非常适合您的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章