我是一個Haskell和一個Stackoverflow noob,這裏是我的 第一個&可能很基本的Haskell問題。基本的Haskell單形/多態問題(HList)
module M where
import Data.HList
data R r a
r1 = undefined :: R a Int
r2 = undefined :: R a Double
rPair :: R r a -> R r b -> (R r a, R r b)
rPair = (,)
rp = rPair r1 r2
這是有道理的,即使R1 R2 &是R中的多態性 rPair對齊按照類型 簽名的R型。這個「對齊」有技術術語嗎?如果R的傳遞是單形性在R, 根據需要限制名單的R型
class HList l => RList r l
instance RList r HNil
instance RList r l => RList r (HCons (R r a) l)
rCons :: RList r l => R r a -> l -> (HCons (R r a) l)
rCons = hCons
rc = rCons r1 (rCons r2 hNil)
rCons的偉大工程。但如果他們 在r中是多態的,它不會按照rPair 的方式對齊它們,並給出錯誤(定義上面的rc)。
No instance for (RList r (HCons (R r1 Double) HNil))
我有一個模糊的直覺,爲什麼是這樣的話,但 我的問題是兩個部分。難道有人明確解釋 的現象?我將如何編寫一個rCons,以便下面的 可以成立?
r1 = undefined :: R a Int
r2 = undefined :: R a Double
rc :: HCons (R a Int) (HCons (R a Double) HNil)
rc = rCons r1 (rCons r2 hNil)
感謝, _c
更新:如果我將它更改爲'class HList l => RList r l | (r GHC.Prim.Any Int)(HCons(R GHC.Prim.Any Double)HNil)編譯的UndecidableInstances和FunctionalDependencies。現在只需要弄清楚實際上的含義 – polypus74 2011-03-05 00:54:23
對於函數依賴關係,「| l - > r」通常可以理解爲「l唯一確定r」。這是否有助於你的直覺?另外你稱之爲對齊/對齊我稱之爲「統一」Haskell的類型系統基於「統一」(就像Prolog的評估一樣)。 – 2011-03-05 08:48:56
只是爲了讓讀者放心,這不是一個noob Haskell問題。我認爲這種「協調」被稱爲「統一」,並且這些類型被認爲是「統一的」。但是這是基於類型檢查器在未匹配類型時所說的,所以我可能是錯的。 – 2011-03-05 14:09:59