我理解 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/