下面描述的所有实验都是用GHC 8.0.1完成的。 此问题是RankNTypes with type aliases confusion的后续行动。这个问题有归结为类型的像这样的功能... {-# LANGUAGE RankNTypes #-}
sleight1 :: a -> (Num a => [a]) -> a
sleight1 x (y:_) = x + y
...这是由类型检查
Haskell wiki page上排名-N-类型告诉这类 forall a . a -> (forall b . b -> a)
有排名1.我相信这个事实,似乎可以理解为我(记住我已经知道如何确定函数的排名)。然而,当我试图写下面的代码: {-# LANGUAGE ExplicitForAll #-}
foo :: forall a . a -> (forall b . b -> a)
这个问题显然与讨论的问题here和here有关。不幸的是,我的要求与这些问题略有不同,所给出的答案不适用于我。我也不太明白为什么runST未能在这些情况下输入检查,这没有帮助。 我的问题是这样的,我有一个代码段使用一个单子堆栈,或者更确切地说,一个单子: import Control.Monad.Except
type KErr a = Except KindError a
的另一段代码需要
在我的(威力不正确)的理解,下面的两个表应该是等价的: [1, "a"] :: [forall a. Show a => a]
data V = forall a. Show a => V a
[V 1, V "a"] :: [V]
然而,第一个是不能接受的,但第二个工作正常(与ExistentialQuantification)。 如果第一个列表不存在,map V :: ??? ->
为什么不在下面的类型检查? _的类型被推断为Double。 {-# LANGUAGE ScopedTypeVariables, Rank2Types #-}
module Main (main) where
data D a = D a
main =
let
n = D (1 :: forall a. (Floating a) => a)
in
我有一个类型: type DifferentiableFunction n a = (Function n a, List n (Function n a), String)
在其他地方,我定义: data Something where
Operator :: Something -> (forall a . Floating a => DifferentiableFunction
像Maybe (Lens' a b)这样的类型不起作用,因为Lens'是一种Rank-2类型,不能在没有-XImpredicativeTypes扩展名(在GHC中不支持)的扩展中包装在类型构造函数中。 因此什么是给将在道义上有型 foo :: A -> Maybe (Lens' B C)
一种可能性是将Maybe推迟到通过延续 foo' :: ∀ y . A -> (Lens' B C ->