Haskell中的S组合子

vsikbqxv  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(105)

在Haskell中,是否可以只使用标准函数(不使用等式定义),不使用lambda(匿名函数)来表示S combinator的类似物?我希望它的类型为(a -> b -> c) -> (a -> b) -> a -> c
例如,K组合子的模拟值就是const
事实上,我试图用标准函数来表达函数\f x -> f x x,但想不出任何标准的非线性函数来开始(这是一个不止一次使用其参数的函数)。

qf9go6mv

qf9go6mv1#

s = (<*>)用于((->) r)Applicative示例。

t0ybt7op

t0ybt7op2#

虽然它看起来不像它在第一,ap是S组合子(和join是组合子你真正的追求)。

brtdzjyr

brtdzjyr3#

也可以使用(=<<), (>>=)
它们被收录在《前奏曲》中

instance Monad ((->) r) where  
    return = const
    f >>= k = \ r -> k (f r) r

字符串

83qze16e

83qze16e4#

对我来说,只有在写出如下类型时才能理解:
Wiki notation of the S combinator

Sxyz = xz(yz)

字符串
假设x是一个有两个参数的函数,y是一个有一个参数的函数,z是一个值。值z被传递到y;结果和z一起被传递到x
<*>的定义是

(<*>) :: f (a -> b) -> f a -> f b


其中f是函数函子((->) r),它只是常用函数类型表示法r -> ..的前缀表示法,因此只需扩展类型结果(为了简单起见,隐藏了一些->箭头),

(<*>) :: f (a -> b)  ->  f a  ->  f b
          f (a -> b)      f a      f b
         r->(a -> b)     r->a     r->b
         r-> a -> b      r->a     r->b
         ^^^^^^^^^^      ^^^^     ^
         x (2args)       y (1arg) z (value)


与S组合子一样,值z(对应于r)被传递给y(对应于r -> a);该结果(对应于a)与z一起作为第一个参数传递给x(对应于r -> a -> b)。最终结果对应于b

相关问题