Haskell 应用程序和 ErrorT?
为什么我可以执行以下操作:
import Data.Word
import Data.Binary.Get
import Control.Applicative
import Control.Monad.Error
getW1 :: ErrorT String Get Word8
getW1 = lift getWord8
f1 = (+1) <$> getW1
但我不能执行以下操作:
f2 = (+) <$> getW1 <*> getW1
以及如何修改 f2 以便它按我的预期工作?
Why is it that I can do the following:
import Data.Word
import Data.Binary.Get
import Control.Applicative
import Control.Monad.Error
getW1 :: ErrorT String Get Word8
getW1 = lift getWord8
f1 = (+1) <gt; getW1
but I cannot do:
f2 = (+) <gt; getW1 <*> getW1
and how I do I modify f2 so that it will work as I intend?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
<$>
仅要求ErrorT String Get
是Functor
的实例。<*>
要求它是Applicative
的实例。我认为这个实例声明应该有效:<$>
only requires thatErrorT String Get
to be an instance ofFunctor
.<*>
requires that it be an instance ofApplicative
. I think this instance declaration should work:要进行错误处理,您不一定需要
Either(T)
monad。通过组合留在Applicative
中,您可以完美地完成任务。示例(为了好玩,使用AccValidation
来累积所有错误):To do error handling, you don't necessary need the
Either(T)
monad. You can be perfectly fine by staying inApplicative
via composition. Example (for fun usingAccValidation
which accumulates all errors):