寻找haskell高阶函数

寻找haskell高阶函数,haskell,functional-programming,function-composition,pointfree,Haskell,Functional Programming,Function Composition,Pointfree,将列表拉入自身的函数可以定义为: let adjacent1 l = zip l $ tail l 这是可行的,但我想用无点风格来定义它。为此,我定义了一个函数dollarize: let dollarize f1 f2 x = f1 x $ f2 x let adjacent1 = dollarize zip tail 这是可行的,但显然我不想定义自己的高阶函数。假设存在的话,有没有办法找到美元化的标准等价物?如果没有,那么用于组合函数的此类函数在哪里?使用(>)a的应用程序实例如何 Pr

将列表拉入自身的函数可以定义为:

let adjacent1 l = zip l $ tail l
这是可行的,但我想用无点风格来定义它。为此,我定义了一个函数
dollarize

let dollarize f1 f2 x = f1 x $ f2 x
let adjacent1 = dollarize zip tail

这是可行的,但显然我不想定义自己的高阶函数。假设存在的话,有没有办法找到美元化的标准等价物?如果没有,那么用于组合函数的此类函数在哪里?

使用
(>)a
应用程序实例如何

Prelude Control.Applicative> :t zip <*> tail
zip  <*> tail :: [a] -> [(a, a)]
Prelude Control.Applicative> zip <*> tail $ [1 .. 4]
[(1,2),(2,3),(3,4)]
Prelude Control.Applicative>:t zip tail
拉链尾::[a]->[(a,a)]
前奏曲控件.Applicative>zip tail$[1..4]
[(1,2),(2,3),(3,4)]

简短而甜美。

符合@Daniel Fischer的回答。您还可以使用
(>)a的monad实例

Prelude Control.Monad.Instances> let adjacent1 = tail >>= flip zip
Prelude Control.Monad.Instances> adjacent1 [1..4]
[(1,2),(2,3),(3,4)]
该工具可以自动为您执行此操作

$ pointfree "\l -> zip l (tail l)"
ap zip tail
$ pointfree "\f1 f2 x -> f1 x $ f2 x"
ap

是的,刚刚检查过,我不确定。如果你记得函数上的
只是函数合成,而使用
id
合成显然没有任何作用,这一点很明显。还值得一提的是,
是SKI演算中的S组合子。如果我知道SKI演算,这会有所帮助;)是的,这是我想做的事情,但是如果我不知道的话,我怎么找到
。但是,在这种情况下,它找不到答案,因为它专门处理函数arrow
(>)
,所以它永远找不到依赖于将
(a->)
用作monad/应用程序的函数,所以搜索
f(b->c)->fb->fc
是有效的,但不是
(a->b->c)->(a->b)->a->c
。如果您是IRC的普通用户,
#haskell
lambdabot
也可以做同样的事情。只要查询它
@pl\l->zip l(tail l)
,你就会得到相同的答案。