在Monad中生成Rank2Type

alex404

所以我简单地理解Rank2Types,但是当我尝试以下内容时

{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}

import Data.Machine

f :: IO (Process a a)
f = return . auto $ id

GHC咳嗽

Couldn't match type `MachineT m0 (Is a0) a0'
              with `forall (m :: * -> *). Monad m => MachineT m (Is a) a'
Expected type: IO (Process a a)
  Actual type: IO (MachineT m0 (Is a0) a0)
In the expression: return . auto $ id
In an equation for `f': f = return . auto $ id
Failed, modules loaded: none.

据我所知,GHC不允许我在Monad上投入巨资。是否有原则上的量化逻辑原因,或者这仅仅是GHC的局限性?还是我只是在做傻事?

宇宙的

您的特定示例可以按以下方式工作:

{-# LANGUAGE ImpredicativeTypes, RankNTypes #-}

import Data.Machine

f = (return :: (forall a. Process a a) -> IO (forall a. Process a a)) (auto id)

正如Carl所说,您必须注释您要强制使用的功能,例如return此处。即使这样,在GHC中使用强制性类型仍然有些脆弱。我不推荐它。限制的原因很简单,即在强制性类型存在的情况下执行类型推断很困难,此外,Haskell的表面语言没有适当的语法来指定要实例化多态函数的类型。

常见的解决方法是将内容包装在中newtype

data PolyProcess = PP (forall a. Process a a)

f' :: IO PolyProcess
f' = return $ PP $ auto $ id

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章