标签: function-composition

延续传球风格 - 功能构成

我正在学习使用Racket的CPS,我已经设法编写了这些函数:

;lift a regular single-arg function into CPS
(define (lift/k f)
  (lambda (x k)
    (k (f x))))

;compose two CPS functions
(define (compose/k f g)
  (lambda (x k)
    (g x (lambda (y)
           (f y k)))))
Run Code Online (Sandbox Code Playgroud)

他们似乎工作正常

(define (is-two/k x k)
  (k (= x 2)))
(define is-not-two/k (compose/k (lift/k not) is-two/k))
(is-not-two/k 3 display)
(is-not-two/k 2 display)

#t#f
Run Code Online (Sandbox Code Playgroud)

我想知道这些功能是否仍然是"真正的CPS".我是否搞砸了"真正的"继续传递这些功能?在CPS中使用函数组合技术是犹太的吗?是鼓励吗?或者它会被视为"妥协"吗?是否有更多的CPS-y方式来做到这一点?

是的我知道我刚问了5个问题,但是他们背后的基本思想(我不确定我是否正确理解)是一样的.其他Lisps,Haskell,Erlang或其他函数式语言的解释都很好.

lisp haskell function-composition continuation-passing racket

4
推荐指数
1
解决办法
1036
查看次数

如何使用id更改类型进行组合

如果类型foldr

> :t foldr
forall a b. (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)

> :t id
forall a. a -> a
Run Code Online (Sandbox Code Playgroud)

然后我希望foldr (.) id有相同的类型foldr,而不是

> :t foldr (.) id
forall b. [b -> b] -> b -> b
Run Code Online (Sandbox Code Playgroud)

看来我错了有关成分是如何工作的,因为我原本以为,对于一个功能ff . id将给予f(id(x)) == f(x),保持的类型f.我foldr (.) id更容易误解的是如何更普遍地澄清其含义和构成?

haskell function-composition

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

fmap fmap 如何应用于函数(作为参数)?

我试图了解如何fmap fmap适用于 say 之类的函数(*3)

的类型fmap fmap

(fmap fmap):: (Functor f1, Functor f) => f (a -> b) -> f (f1 a -> f1 b)
Run Code Online (Sandbox Code Playgroud)

类型(*3)

(*3) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

这意味着签名a -> a对应于f (a -> b),对吗?

Prelude> :t (fmap fmap (*3))
(fmap fmap (*3)):: (Num (a -> b), Functor f) => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个简单的测试:

test :: (Functor f) …
Run Code Online (Sandbox Code Playgroud)

haskell types function functor function-composition

4
推荐指数
1
解决办法
572
查看次数

Scala中的惯用Haskell式迭代?

在Haskell中,我可以通过调用以获得无限的顺序函数应用程序列表:

iterate :: (A -> A) -> A -> [A]
Run Code Online (Sandbox Code Playgroud)

假设我有scala f(x: A): A.是否有一个函数会产生顺序函数应用程序流?喜欢iter(f: A => A, x: A): Stream[A]

haskell scala function-composition

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

如何在 Lodash/FP 中组合函数然后应用参数

我试图通过使用 Lodash/FP 清理一些旧代码来了解更多关于在函数式编程中使用柯里化和组合的知识。但是,我反复遇到我有一个函数并且我想传递一个或多个函数的情况。然后我想将将用作参数的值传递给我传递给原始函数的函数。

我发现很难准确解释我想要做什么,所以我制作了一个 JS Fiddle,展示了我是如何尝试解决这个问题的:https : //jsfiddle.net/harimau777/rqkLf1rg/2/

const foo = a => `${a}${a}`
// Desired Behavior: const ans1 = (a, b) => `${foo(a)}${foo(b)}`
const ans1 = _.compose(
    (a, b) => `${a}${b}`,
  foo,
  foo
)
// Desired Result: '1122'
console.log(ans1('1', '2'))

// Desired Behavior: const ans2 = a => a.map(a => a + 1)
const ans2 = _.compose(
    _.map,
  a => a + 1
)
//Desired Result: [2, 3, 4]
console.log(ans2([1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

根据下面 Ori Drori 的回答,我认为我可以澄清我的问题(这是人们通常如何跟进 StackOverflow 而不是提出新问题?):假设不是将相同的函数序列应用于我想要的两个输入将一系列函数应用于第一个输入,将不同的序列应用于第二个输入,并将两个结果用作 …

javascript currying function-composition lodash

4
推荐指数
1
解决办法
9615
查看次数

链接和功能组合

这是我想要了解的一段代码:

const seq2 = (f1, f2) => {
 return (...args) => {

  return f2( f1( ...args) );
 }
}



const seq = ( f1, ...fRest) =>
 fRest.reduce( seq2, f1 );

const elevator = {
 floor: 5
};

const up = elevator => {
 return {
  floor: elevator.floor + 1
 }
};

const down = elevator => {
 return {
  floor: elevator.floor - 1
 }
};


const move = seq( up, up, down, up);
const newElevator = move( elevator );



console.log( …
Run Code Online (Sandbox Code Playgroud)

javascript functional-programming chaining function-composition

4
推荐指数
1
解决办法
121
查看次数

在没有第二个参数的情况下如何使用合成运算符?

我碰到了的用法。我不太了解的运算子。

我本人试图对此进行推理,但得出的结论与GHCI产生的结论不同。

我正在:t检查表达式的类型。

我正在使用的函数是last(.),它们具有以下签名:

last :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

我感到困惑的功能是这样的:

(last .)
Run Code Online (Sandbox Code Playgroud)

我不确定这个构造是什么,但是我认为它与函数组成类似。使用我的推理,我希望这会产生以下功能:

(last .) :: (b -> [c]) -> (a -> b) -> a -> [c]
Run Code Online (Sandbox Code Playgroud)

什么:t实际上给了我是这样的:

(last .) :: (a -> [c]) -> a -> c
Run Code Online (Sandbox Code Playgroud)

haskell function-composition

4
推荐指数
1
解决办法
49
查看次数

函数组合(。)如何从内部工作?

我正在学习Haskell。目前,我正在研究功能组合。我了解(至少在基本层面上)如何使用函数(.),但是有两点我不了解。

因此该函数如下所示:

(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)

首先,类型声明。(b -> c) -> (a -> b)本质上是指函数f从函数的结果value(bg(取value a)中取参数并返回type的value c。我不明白下面的部分-> a -> c,为什么要在-> a那里?为什么(b -> c) -> (a -> b) -> c错了?从我的观点(显然是错误的)来看,函数g已经a作为参数了。

第二,主体的功能f . g = \x -> f (g x)\x -> …

syntax lambda haskell function-composition

4
推荐指数
1
解决办法
115
查看次数

使用$运算符将两个括号链接在一起

我有这个功能:

min (max 10 20) (max 30 40)
Run Code Online (Sandbox Code Playgroud)

我可以改写为:

min (max 10 20) $ max 30 40
Run Code Online (Sandbox Code Playgroud)

但是还有办法解决这些最后的括号吗?

不像这不够好,但我不能放下思想,必须有一些方法来做到这一点......

syntax haskell dollar-sign function-composition

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

Scala中带有期货的咖喱函数

我正在学习scala,想了解如何Futures针对咖喱函数实现

import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global

object MainApp {

  def main(args: Array[String]): Unit = {

    val x = curriedMultiply(10) _ andThen Await.result(curriedAdd(10),Duration.Inf)

    println(x(2))



  }

  def curriedAdd(x: Int)(y: Int) : Future[Int]= Future {
    x + y
  }

  def curriedMultiply(x: Int)(y: Int) : Future[Int] = Future {
    x * y
  }

}
Run Code Online (Sandbox Code Playgroud)

获取值时出现以下编译器错误

Type mismatch, expected: Awaitable[NotInferedT], actual: Int => Future[Int]
Run Code Online (Sandbox Code Playgroud)

scala function-composition

3
推荐指数
1
解决办法
92
查看次数