2011-03-04 23 views
4

我是一個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

+0

更新:如果我將它更改爲'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

+0

對於函數依賴關係,「| l - > r」通常可以理解爲「l唯一確定r」。這是否有助於你的直覺?另外你稱之爲對齊/對齊我稱之爲「統一」Haskell的類型系統基於「統一」(就像Prolog的評估一樣)。 – 2011-03-05 08:48:56

+0

只是爲了讓讀者放心,這不是一個noob Haskell問題。我認爲這種「協調」被稱爲「統一」,並且這些類型被認爲是「統一的」。但是這是基於類型檢查器在未匹配類型時所說的,所以我可能是錯的。 – 2011-03-05 14:09:59

回答

1

要回答你的第二個問題,你可以使用類型等價約束(從TypeFamilies擴展)放鬆RList實例定義:

class HList l => RList r l 
instance RList r HNil 
instance (RList r1 l, r1 ~ r2) => RList r1 (HCons (R r2 a) l) 

現在你rc會推斷爲所需的類型。

我不認爲我可以,雖然「解釋清楚」的現象(有人肯定會),但很明顯,rPairrCons之間的區別是,前者結合r型兩個參數的同一類型的變量,後者不會:第二個參數只是l約束,因爲l應該有一些RList的實例)。由於沒有爲rc沒有類型標記(注意,如果你提供一個你原來的例子typechecks)和R1和R2具有多態性,不等同r的,編譯器試圖找到RList r (HCons (R r1 Double) HNil)實例的定義(r來自第一個參數和r1 - 從第二個),但沒有這樣做。 對於類型等價約束我們定義的rlist的實例與兩個不同的r1r2,唯一的條件是,這些需求是等同的,所以它看起來像GHC的l解決的RList實例時,他們結合到同一個多態類型的變量。

+0

感謝您的提示。將在〜 – polypus74 2011-03-05 03:04:56

+0

進一步閱讀:http://haskell.org/haskellwiki/GHC/Type_families – 2011-03-05 18:15:11