首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RankNpolymorphism和克莱斯利的命运之箭

RankNpolymorphism和克莱斯利的命运之箭
EN

Stack Overflow用户
提问于 2015-11-03 06:38:22
回答 1查看 139关注 0票数 4

我不明白为什么demonbind1的定义会产生一些编译器错误。它看起来像一个愚蠢的翻转,但不知何故..

代码语言:javascript
复制
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes, ScopedTypeVariables, TypeOperators, TypeFamilies,ImpredicativeTypes   #-}

type a :-> b = forall i . a i -> b i

class IFunctor f where imap :: (a :-> b) -> (f a :-> f b)

class (IFunctor m) => IMonad m where
    skip :: a :-> m a
    bind :: (a :-> m b) -> (m a :-> m b)


-- Conor McBride's "demonic bind"
(?>=) :: forall m a b i. (IFunctor m, IMonad m) => m a i -> (a :-> m b) -> m b i
(?>=) =  
  let
    -- OK 
    demonbind0 = flip (bind :: forall i. (forall j. a j -> m b j)  -> m a i -> m b i ) 
    -- KO - see error below
    demonbind1 = flip  bind :: forall i. m a i -> (forall j. a j -> m b j)  ->  m b i

    -- So i have to write this
    demonbind2 :: forall i. (m a i ->  (a :-> m b)  ->  m b i )
    demonbind2 mai ti = (bind ti) mai 
  in demonbind2

错误是

代码语言:javascript
复制
Couldn't match type ‘a j0 -> m b j0’ …
              with ‘forall i2. a i2 -> m b i2’
    Expected type: (a j0 -> m b j0) -> m a i1 -> m b i1
      Actual type: a :-> m b -> m a i1 -> m b i1
 In the first argument of ‘flip’, namely ‘bind’
    In the expression:
        flip bind :: forall i. m a i -> (forall j. a j -> m b j) -> m b i
EN

回答 1

Stack Overflow用户

发布于 2016-03-23 09:18:22

有些令人惊讶的是,在GHC8.0的开发快照中,ImpredicativeTypes似乎比往常更好!这段代码编译时没有错误:

代码语言:javascript
复制
(?>=) :: (IFunctor m, IMonad m) => m a i -> (a :-> m b) -> m b i
(?>=) = flip bind

我想知道是什么改变解决了这个问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33488322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档