Haskell の構文を理解しています。
"play-note" という関数をカリー化 (部分的に適用) し、1 つの引数を "手動" で渡し、2 つ目の引数をマップで渡したいと考えています。
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
スキームバージョンは「コンパイル」しますが、私が期待することをしません(最初の引数をカリー化し、次に2番目の引数をカリー化します)。ヘルプ?ありがとう!
編集:
私の問題の本質は、次のコードが正しい結果を生成するように、2 つの引数を取る関数を定義できないことです:
map ({some function} {some value; argument 1}) {some list; each element will be an argument 2}