为什么编译器对同构类型生气?

时间:2016-04-22 19:30:40

标签: haskell monads

Expected type: ErrorT String IO Integer
Actual type: IO (Either String Integer)

我不知道,我哪里错了。毕竟,这些类型是同构的 当然,当我从

替换我的功能签名时
ErrorT String IO Integer  

IO (Either String Integer)

编译器很高兴,但我不高兴,因为我很困惑。

1 个答案:

答案 0 :(得分:4)

回答有点棘手,因为没有真正的问题,但编译器不满意,因为类型可能是同构但它们不是同义词 - 在{...}中有一个ErrorT方式:

newtype ErrorT e m a = ErrorT m (Either e a)
                       ^^^^^^

see here

你已经在另一个问题中遇到过这个问题 - 这是

之类的区别
return (Left "Hello") :: IO (Either String Integer)

ErrorT (return (Left "Hello")) :: ErrorT String IO Integer