我不明白为什么我不能分解一个(比如说IO)单子。喜欢IO a -> a
吗?
使用happstack和希望得到的,当我的问题起源Text
的出ServerPart (Maybe Text)
这是由返回(optional $ lookText "domain")
。然后我记得读过《IO
莫纳德》无法逃脱。
我已经读到了unsafePerformIO
它的原因以及它不好的原因,但是这些原因似乎都无法回答我的问题。
Monad
逃脱吗?是的。这是很容易与许多Monad
S,如Maybe
,Either a
,State
,Identity
,等等。Monad
函数中最常见的之一是Monad
:(->) r
。如果不可能将一个函数转换为一个值,那么Haskell就不会有太多用处了。
IO
逃脱吗?不幸的是。这将是好了很多,对于初学者来说,如果他们没有谷歌四周,看看他们可以从技术上逃避IO
使用unsafePerformIO
,正如你可能已经猜到了是不是安全。它并不是要在普通代码中使用,而是在您真正需要它时成为运行时系统的后门。最初,它用于实现一些较低级别的库(例如)Vector
,也用于与外部共享库(DLL)进行接口。如果您不编写此类代码,请不要使用unsafePerformIO
。否则,您将最终获得难以推理和维护的代码,因为它绕过了类型系统。
Monad
?从变化Monad
到Monad
,但大部分单子变压器具有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来了解它。但是,通过快速搜索,我在他们的网站上找到了此示例,该示例似乎非常适合您的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句