[英]Lambda for type expressions in Haskell?
Haskell或特定編譯器是否具有類型級lambda(如果這甚至是一個術語)?
詳細說,我說有一個參數化類型Foo ab
並希望Foo _ b
成為Functor的一個實例。 是否有任何機制可以讓我做類似的事情
instance Functor (\a -> Foo a b) where
...
?
雖然sclv回答了你的直接問題,但我會補充一點,“類型級lambda”的含義不止一個。 Haskell有各種類型的運算符,但沒有一個真正表現為正確的lambdas:
A
和類型構造函數F
,函數應用程序FA
也是類型,但不包含比“這是應用於A
F
”更多的(類型級別)信息。 a -> b -> a
隱含意味着forall a b. a -> b -> a
forall a b. a -> b -> a
。 forall
在其范圍內綁定類型變量,因此表現得有點像lambda。 如果記憶為我服務,這大致是系統F中的“資本lambda”。 其他擴展放松了一些提到的限制,或提供部分解決方法(另請參閱:Oleg的類型hackery)。 然而,幾乎你不能以任何方式做任何事情的一件事正是你所要求的,即引入一個帶有匿名函數抽象的新綁定范圍。
來自TypeCompose:
newtype Flip (~>) b a = Flip { unFlip :: a ~> b }
http://hackage.haskell.org/packages/archive/TypeCompose/0.6.3/doc/html/Control-Compose.html#t:Flip
另外,如果某個東西是兩個參數中的Functor,你可以把它變成一個bifunctor:
http://hackage.haskell.org/packages/archive/category-extras/0.44.4/doc/html/Control-Bifunctor.html
(或者,在后來的類別中,一個更通用的版本: http : //hackage.haskell.org/packages/archive/category-extras/0.53.5/doc/html/Control-Functor.html#t : Bifunctor )
我不喜歡回答我自己的問題的想法,但顯然,根據Freenode上#haskell上的幾個人,Haskell沒有類型級別的lambdas。
EHC(也許還有其繼承者,UHC)具有類型級別的lambda,但它們沒有文檔記錄,也沒有依賴類型語言那么強大。 我建議您使用依賴類型的語言,例如Agda(類似於Haskell)或Coq(不同,但仍然是純函數的核心,可以懶惰或嚴格解釋和編譯!)但我偏向於這些語言,這可能是你要求的100倍矯枉過正!
我知道最接近一個類型lambda是通過定義類型同義詞。 在你的例子中,
data Foo a b = Foo a b
type FooR a b = Foo b a
instance Functor (FooR Int) where
...
但即使使用-XTypeSynonymInstances -XFlexibleInstances,這也行不通; GHC期望類型syn完全應用於實例頭中。 可能有某種方式用類型系列來安排它。
是的,Gabe說的是,類型家庭有些回答:
根據具體情況,您可以使用“翻轉”版本替換原始類型定義,然后為“正確”版本創建類型同義詞。
從
data X a b = Y a b
instance Functor (\a -> X a b) where ...
至
data XFlip b a = Y a b -- Use me for instance decalarations
type X a b = XFlip b a -- Use me for everything else
instance Functor XFlip where ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.