haskell - 在Scheme中柯里化(Currying) map

标签 haskell functional-programming scheme currying

我理解 Haskell 语法。

我想柯里化(Currying)(部分应用)一个名为“play-note”的函数,并“手动”传递一个参数,并使用 map 传递第二个参数。

如果我能用 Haskell 写它,我会说:

playNote :: Time -> Instrument -> Int -> Int -> Int -> Int -> Music -- made up, but just to give you an idea

notes = [46, 47, 35, 74]  
loopGo = True

loop time = do mapM_ (playNote' time) notes 
               if loopGo then (loop (time+(second/2))) else return () -- time element removed
playNote' time pitch = playNote time drums pitch 80 11025 9 -- ignore extra args

在计划中,这是我所拥有的最好的:

(define notes '(46 47 35 74))  
(define *loop-go* #t)
(define play-note-prime  
   (lambda (time2)  
      (lambda (pitch)  
         (play-note time2 drums pitch 80 11025 9))))  ; drums is another variable
(define loop  
   (lambda (time)  
      (map (play-note-prime time) notes)  
      (if *loop-go*  
          (callback (+ time (/ *second* 2)) 'loop (+ time (/ second 2)))))) ; time element is more sophisticated here

Scheme 版本可以“编译”,但没有达到我的预期(柯里化(Currying)第一个参数,然后是第二个参数)。帮助?谢谢!

编辑:
我的问题的本质是无法定义一个带有两个参数的函数,以便以下代码产生正确的结果:

map ({some function} {some value; argument 1}) {some list; each element will be an argument 2}

最佳答案

回答我自己的问题:

该函数需要被定义为“零散”地接受参数:换句话说,它并不是真正的柯里化(Currying)。我在上面尝试过,但没有得到正确的结果。

部分应用的函数需要被描述为 lambda 或 lambda 链,每个 lambda 都准确接受将传递的参数数量(按接收时间的降序排列)。

一个工作示例:

(define nums '(3 3 1 2))
(define f
   (lambda (num1)
      (lambda (num2)
         (expt num1 num2))))
(define ans (map (f 5) nums))
(print ans)

将 f 定义为接受所有参数将不起作用:

(define f
   (lambda (num1 num2)
      (expt num1 num2))) ; Can't be curried

关于haskell - 在Scheme中柯里化(Currying) map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7171077/

相关文章:

haskell - 无法读取点分隔的整数

haskell - Reader 和 MonadReader

java - 用 Java 编写 Function 接口(interface)

scala - 在 Scala 中执行元组之外的函数

Python 等同于 Scheme Apply

sql - 设计 SQL 替代方案?

haskell - A在sequenceS中代表什么?

Haskell:与自己的数据类型混淆。记录语法和唯一字段

scala - 使用值与参数顺序不匹配的无形 HList 调用 Scala Function2

macros - 使用宏的优秀应用程序和程序集