查找haskell高阶函数

Mar*_*cin 5 haskell functional-programming pointfree function-composition

将列表压缩到自身的函数可以定义为:

let adjacent1 l = zip l $ tail l
Run Code Online (Sandbox Code Playgroud)

这有效,但我想以无点样式定义它.为此,我定义了一个函数dollarize:

let dollarize f1 f2 x = f1 x $ f2 x
let adjacent1 = dollarize zip tail
Run Code Online (Sandbox Code Playgroud)

这很有效,但显然我不想定义自己的高阶函数.有没有办法找到标准的等价物dollarize,假设它存在?如果没有,这种功能在哪里组合功能?

ham*_*mar 11

pointfree工具可以自动为您完成此操作.

$ pointfree "\l -> zip l (tail l)"
ap zip tail
$ pointfree "\f1 f2 x -> f1 x $ f2 x"
ap
Run Code Online (Sandbox Code Playgroud)

  • 如果你是一个普通的IRC用户,``haskell`的`lambdabot`可以做同样的事情.只需查询它`@pl\l - > zip l(tail l)`,你就会得到相同的答案. (2认同)

Dan*_*her 6

如何使用Applicative实例(->) 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)]
Run Code Online (Sandbox Code Playgroud)

简短又甜蜜.

  • ......或者只是`zip <*> tail`. (4认同)
  • @Marcin:通常,我推荐[Hoogle](http://www.haskell.org/hoogle/).但是,它在这种情况下找不到答案,因为它特别处理函数arrow`( - >)`,所以它永远不会找到依赖于使用`(a - >)`作为monad/applicative的函数,所以搜索`f(b - > c) - > fb - > fc`有效,但不是`(a - > b - > c) - >(a - > b) - > a - > c`. (3认同)