haskell - haskell中多个类型变量的顺序规则是什么?

标签 haskell ghc newtype type-variables

例如,ParsecT 在其定义中有多个类型变量。

newtype ParsecT s u m a
    = ParsecT {unParser :: forall b .
                 State s u
              -> (a -> State s u -> ParseError -> m b) 
              -> (ParseError -> m b)                   
              -> (a -> State s u -> ParseError -> m b) 
              -> (ParseError -> m b)                   
              -> m b
             } 

我们可以这样做吗?
newtype ParsecT m a s u     -- Only the order of s u m a is changed to m a s u.
    = ParsecT {unParser :: forall b .
                 State s u
              -> (a -> State s u -> ParseError -> m b) 
              -> (ParseError -> m b)                   
              -> (a -> State s u -> ParseError -> m b) 
              -> (ParseError -> m b)                   
              -> m b
             }

我想知道当我们定义一个新类型时,是否有关于类型变量顺序的规则或原则。

最佳答案

在这种情况下,a是最后一个,因为我们想要 ParsecT s u m __要成为一个 monad,这样,我们的解析器寻找的东西可能取决于他们之前发现的东西,等等。如果 u最后来了,我们不能写

 instance Monad m => Monad (ParsecT s u m) where ...
m是倒数第二个,因为我们想要 ParsecT s u成为一个“单子(monad)变压器”
 class MonadTrans t where 
     lift :: m a -> t m a 

 instance MonadTrans (ParsecT s u) where ...

如果我们把 m首先,这种情况是不可能的。订购 s 似乎没有任何类似的原因和 u .

关于haskell - haskell中多个类型变量的顺序规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860473/

相关文章:

haskell - Haskell中 `data`和 `newtype`之间的区别

haskell - 易安装失败

sqlite - 使用 Scotty 和 Sqlite 并在 Monad 方面遇到一些麻烦

haskell - 黑线鳕的差异文档

list - 将函数映射到定义为数据结构列表的新类型

haskell - 广义新型推导

haskell - 向类型类定义添加附加函数/组合器有哪些优点和缺点?

haskell - “惯用的” haskell 型不等式

multithreading - `getErrno` 和线程

haskell - 减少 GHC 生成的可执行文件的大小