Haskell或特定的编译器是否有类似级别的lambdas(如果这甚至是一个术语)?
详细说明,我说参数化类型Foo a b
并希望Foo _ b
成为Functor的一个实例。是否有任何机制可以让我做类似于
instance Functor (\a -> Foo a b) where
...
答案 0 :(得分:24)
虽然sclv回答了你的直接问题,但我会补充一点,“类型级lambda”的含义不止一个。 Haskell有各种类型的运算符,但没有一个真正表现为正确的lambdas:
A
和类型构造函数F
,函数应用程序F A
也是一个类型,但不包含“应用F
的其他(类型级别)信息A
”。a -> b -> a
的类型隐式表示forall a b. a -> b -> a
。 forall
绑定其范围内的类型变量,因此行为有点像lambda。如果记忆为我服务,这大致是系统F中的“资本lambda”。其他扩展放松了一些提到的限制,或提供部分解决方法(另请参阅:Oleg的类型hackery)。然而,你在任何地方都无法做到的一件事就是你所要求的,即引入一个带有匿名函数抽象的新绑定范围。
答案 1 :(得分:17)
来自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)
答案 2 :(得分:7)
我不喜欢回答我自己的问题,但显然,根据Freenode上#haskell上的几个人,Haskell没有类型级别的lambdas。
答案 3 :(得分:5)
EHC(也许还有其继承者,UHC)具有类型级别的lambda,但它们没有文档记录,也没有依赖类型语言那么强大。我建议您使用依赖类型的语言,例如Agda(类似于Haskell)或Coq(不同,但仍然是纯函数的核心,并且可以严格地解释和编译或!)但是我对这些语言有偏见,这可能是你要求的100倍矫枉过正了!
答案 4 :(得分:2)
我所知道的最接近的类型lambda是通过定义类型同义词。在您的示例中,
data Foo a b = Foo a b
type FooR a b = Foo b a
instance Functor (FooR Int) where
...
但即使使用-XTypeSynonymInstances -XFlexibleInstances,这也行不通; GHC期望类型syn完全应用于实例头中。可能有一些方法可以用类型系列来安排它。
答案 5 :(得分:1)
是的,Gabe说的是,类型家庭对此有所回答:
答案 6 :(得分:0)
根据情况,您可以将原始类型定义替换为“翻转”版本,然后为“正确”版本创建类型同义词。
来自
super().save(*args, **kwargs)
send_email(self.document.url)
到
data X a b = Y a b
instance Functor (\a -> X a b) where ...