能否用仅使用标准函数(不通过方程定义)和不使用lambda(匿名函数),在Haskell中表达S combinator的类比?我期望它的类型为(a -> b -> c) -> (a -> b) -> a -> c
。
例如,K combinator的类比就是const
。
事实上,我正在尝试使用标准函数来表达函数\f x -> f x x
,但无法想到任何标准的非线性函数来开始(即使用其参数多次的函数)。
能否用仅使用标准函数(不通过方程定义)和不使用lambda(匿名函数),在Haskell中表达S combinator的类比?我期望它的类型为(a -> b -> c) -> (a -> b) -> a -> c
。
例如,K combinator的类比就是const
。
事实上,我正在尝试使用标准函数来表达函数\f x -> f x x
,但无法想到任何标准的非线性函数来开始(即使用其参数多次的函数)。
s = (<*>)
是指为了 ((->) r)
类型的 Applicative
实例。
((->) r)
是什么意思? - Alexeyr ->
。不幸的是,您无法像使用普通运算符一样使用类型运算符进行部分操作。因此,尽管您可以做像 (10*)
这样的事情,但这不是有效的 Haskell (r ->)
。不过,幸运的是,我们有一种语法可以给我们等效的结果:((->) r)
。然而,请注意,我们不能对第二个参数执行相同的操作。这实际上是故意禁止的(我认为在某些情况下可能会使类型推断变得不可能),这就是为什么我们不能有类型运算符部分的原因。 - David Youngtype Function a b = a -> b
,那么 ((->) r)
等同于 Function r
。 - David Youngr
只是一个类型变量吗? - Alexey(-> Int)
这样的东西是不可能的,是因为Haskell不允许反变函子吗? - Alexeyr
是一个类型变量。实际上,Haskell有(或可以有)反变函子 (http://hackage.haskell.org/package/contravariant)。它不允许像`(-> Int)`这样的东西,是因为如果允许你通过部分类型应用程序随意重新排列类型参数,你本质上将在类型级别上拥有完整的λ演算。这将使类型推断成为不可能。 - David Young它还可以使用(=<<), (>>=)
。
它们也包含在Prelude中。
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
\f x -> f x x
在函数单子中被称为join
。 - duplode(.)
,($)
,可能还有flip
:)。 - Alexey