簡體   English   中英

Lambda用於Haskell中的類型表達式?

[英]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說的是,類型家庭有些回答:

http://www.haskell.org/haskellwiki/GHC/Type_families

根據具體情況,您可以使用“翻轉”版本替換原始類型定義,然后為“正確”版本創建類型同義詞。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM