问问题
90 次
1 回答
0
foo baz
不进行类型检查的原因是因为t
它不是Either e
单子上的变压器 - 它是单子上的变压器StateT Int (Either e)
。
以下是它的解析方式:
baz :: MyTransT (StateT Int (StateT Int (Either e))) a
\________/ \_____________________/
t m a
注意m
不是形式。_Either e
您可以创建一个新的转换器,例如StateTIntStateTInt
,然后像这样编写 baz :
baz :: MyTransT (StateTIntStateInt (Either e)) a
然后它会输入检查。例如:
type StateTIntStateTInt = StateT (Int,Int)
baz' :: MyTransT (StateTIntStateTInt (Either e)) a
baz' = undefined
test = foo baz'
但是,即使您解决了类型问题,我也怀疑您是否能够编写函数foo
。考虑这个特定值应该返回什么bar
:
bar0 :: MyTransT (StateT Int (Either String)) Int
bar0 = MyTransT $ lift $ Left "blather"
foo bar0
应该返回什么 Int 值?
于 2016-07-26T18:05:02.470 回答