标签: combinators

什么是Y-combinator?

Y-combinator是一种来自事物"功能"方面的计算机科学概念.大多数程序员对组合器一无所知,如果他们甚至听说过它们的话.

  • 什么是Y-combinator?
  • 组合器如何工作?
  • 它们有什么用?
  • 它们在程序语言中有用吗?

theory computer-science functional-programming combinators definition

381
推荐指数
14
解决办法
10万
查看次数

foldl与具有无限列表的foldr行为

此问题中 myAny函数的代码使用foldr.当谓词满足时,它会停止处理无限列表.

我用foldl重写了它:

myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
   where
      step acc item = p item || acc
Run Code Online (Sandbox Code Playgroud)

(请注意,步骤函数的参数已正确反转.)

但是,它不再停止处理无限列表.

我试图在Apocalisp的答案中跟踪函数的执行情况:

myAny even [1..]
foldl step False [1..]
step (foldl step False [2..]) 1
even 1 || (foldl step False [2..])
False  || (foldl step False [2..])
foldl step False [2..]
step (foldl step False [3..]) 2
even 2 || (foldl step False [3..])
True   || (foldl …
Run Code Online (Sandbox Code Playgroud)

haskell combinators lazy-evaluation fold

115
推荐指数
3
解决办法
2万
查看次数

解释工人的组合器

什么是组合器?

它是"没有自由变量的函数或定义"(在SO上定义)?

或者如何:根据John Hughes在他着名的关于Arrows的论文中,"组合器是一个从程序片段构建程序片段的函数",这是有利的,因为"......使用组合器的程序员构建了大部分所需的自动编程,而不是手工编写每个细节".他接着说,mapfilter是这样的组合子的两个常见的例子.

一些符合第一个定义的组合器:

一些符合第二个定义的组合器:

  • 地图
  • 过滤
  • 折叠/减少(推测)
  • 任何>> =,撰写,fmap ?????

我对第一个定义不感兴趣 - 那些不能帮我写一个真正的程序(如果你说服我错了,那就是+1). 请帮我理解第二个定义.我认为map,filter和reduce非常有用:它们允许我在更高级别编程 - 更少的错误,更短更清晰的代码.以下是关于组合器的一些具体问题:

  1. 有哪些组合器的例子,例如map,filter?
  2. 编程语言经常实现哪些组合器?
  3. 组合器如何帮助我设计更好的API?
  4. 如何设计有效的组合器?
  5. 什么是类似于非功能语言(比如Java)的组合器,或者这些语言用什么来代替组合器?

更新

感谢@CA McCann,我现在对组合器有了更好的理解.但有一个问题对我来说仍然是一个棘手的问题:

用大量使用组合器写的函数程序和没有写的函数程序有什么区别?

我怀疑答案是组合器重型版本更短,更清晰,更通用,但如果可能的话,我希望进行更深入的讨论.

我也在寻找更多关于复杂组合器的例子和解释(比复杂的组合fold语言).

functional-programming combinators

91
推荐指数
1
解决办法
2万
查看次数

foldl是尾递归的,那么foldr如何比foldl运行得更快呢?

我想测试foldl vs foldr.从我所看到的,你应该使用foldl over foldr,因为尾部递归优化.

这是有道理的.但是,运行此测试后,我很困惑:

foldr(使用时间命令时需要0.057秒):

a::a -> [a] -> [a]
a x = ([x] ++ )

main = putStrLn(show ( sum (foldr a [] [0.. 100000])))
Run Code Online (Sandbox Code Playgroud)

foldl(使用time命令时需要0.089s):

b::[b] -> b -> [b]
b xs = ( ++ xs). (\y->[y])

main = putStrLn(show ( sum (foldl b [] [0.. 100000])))
Run Code Online (Sandbox Code Playgroud)

很明显,这个例子很简单,但我很困惑为什么foldr击败foldl.这不应该是foldl获胜的明显案例吗?

optimization haskell tail-recursion combinators fold

68
推荐指数
4
解决办法
2万
查看次数

foldr如何工作?

任何人都能解释一下如何foldr运作?

拿这些例子:

Prelude> foldr (-) 54 [10, 11]
53
Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6]
12.0
Run Code Online (Sandbox Code Playgroud)

我对这些处决感到困惑.有什么建议?

haskell combinators fold

62
推荐指数
8
解决办法
5万
查看次数

对"组合者"的好解释(非数学家)

任何人都对"组合器"(Y-combinators等而不是 公司)有很好的解释?

我正在寻找一个了解递归和高阶函数的实用程序员,但没有强大的理论或数学背景.

(注意:我正在谈论这些事情)

lambda function combinators y-combinator

53
推荐指数
5
解决办法
1万
查看次数

在Haskell中执行`and`和`或`表示布尔函数

我刚写了以下两个函数:

fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool
fand f1 f2 x = (f1 x) && (f2 x)

f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool
f_or f1 f2 x = (f1 x) || (f2 x)
Run Code Online (Sandbox Code Playgroud)

它们可能用于组合两个布尔函数的值,例如:

import Text.ParserCombinators.Parsec
import Data.Char

nameChar = satisfy (isLetter `f_or` isDigit)
Run Code Online (Sandbox Code Playgroud)

看了这两个函数后,我意识到它们非常有用.以至于我现在怀疑它们是否包含在标准库中,或者更可能是使用现有函数有一种干净的方法来执行此操作.

这样做的"正确"方法是什么?

haskell combinators pointfree

42
推荐指数
3
解决办法
5万
查看次数

Data.MemoCombinators如何工作?

我一直在寻找Data.MemoCombinators的来源,但我无法真正看到它的核心位置.

请向我解释所有这些组合器背后的逻辑以及它们如何在实际编程中加速您的程序实际工作的机制.

我正在寻找这个实现的细节,并可选择与其他Haskell方法进行比较/对比来进行memoization.我理解什么是memoization,而不是在寻找它的工作原理.

haskell combinators memoization

38
推荐指数
3
解决办法
2911
查看次数

haskell中的并行映射

是否有一些替代品map并行评估列表?我不需要它懒惰.

类似的东西:pmap :: (a -> b) -> [a] -> [b]让我pmap expensive_function big_list拥有100%的核心.

parallel-processing haskell multicore combinators

33
推荐指数
2
解决办法
1万
查看次数

高阶函数有哪些有趣的用途?

我目前正在做一个函数式编程课程,我对高阶函数和函数作为一等公民的概念感到很开心.但是,我还不能想到许多实用的,概念上令人惊奇的,或者只是简单有趣的高阶函数.(除了典型的和相当乏味map,filter等函数).

你知道这些有趣功能的例子吗?

也许返回函数的函数,返回函数列表的函数(?)等.

我很欣赏Haskell中的例子,这是我目前正在学习的语言:)

haskell functional-programming function combinators higher-order-functions

33
推荐指数
7
解决办法
5594
查看次数