在Haskell中,是否可以只使用标准函数(不使用等式定义),不使用lambda(匿名函数)来表示S combinator的类似物?我希望它的类型为(a -> b -> c) -> (a -> b) -> a -> c
。
例如,K组合子的模拟值就是const
。
事实上,我试图用标准函数来表达函数\f x -> f x x
,但想不出任何标准的非线性函数来开始(这是一个不止一次使用其参数的函数)。
在Haskell中,是否可以只使用标准函数(不使用等式定义),不使用lambda(匿名函数)来表示S combinator的类似物?我希望它的类型为(a -> b -> c) -> (a -> b) -> a -> c
。
例如,K组合子的模拟值就是const
。
事实上,我试图用标准函数来表达函数\f x -> f x x
,但想不出任何标准的非线性函数来开始(这是一个不止一次使用其参数的函数)。
4条答案
按热度按时间qf9go6mv1#
s = (<*>)
用于((->) r)
Applicative
示例。t0ybt7op2#
虽然它看起来不像它在第一,
ap
是S组合子(和join
是组合子你真正的追求)。brtdzjyr3#
也可以使用
(=<<), (>>=)
。它们被收录在《前奏曲》中
字符串
83qze16e4#
对我来说,只有在写出如下类型时才能理解:
Wiki notation of the S combinator是
字符串
假设
x
是一个有两个参数的函数,y
是一个有一个参数的函数,z
是一个值。值z
被传递到y
;结果和z
一起被传递到x
。<*>
的定义是型
其中f是函数函子
((->) r)
,它只是常用函数类型表示法r -> ..
的前缀表示法,因此只需扩展类型结果(为了简单起见,隐藏了一些->
箭头),型
与S组合子一样,值
z
(对应于r
)被传递给y
(对应于r -> a
);该结果(对应于a
)与z
一起作为第一个参数传递给x
(对应于r -> a -> b
)。最终结果对应于b
。