下面描述的所有實驗都是用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 ->