0
4

1 回答 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 回答