Euterpea库中play函数无法播放note生成的音符?求助排查
问题原因与解决办法
错误的核心是Haskell函数应用的优先级规则导致代码被错误解析了。
看报错信息里的表达式:play note (1 / 4) (A, 4),Haskell会把它解析成:
((play note) (1/4)) (A,4)
也就是说,你把note直接传给了play,但play的类型是Music a -> IO ()——它只接受一个Music类型的参数,不接受函数note(note的类型是Dur -> Pitch -> Music Pitch),自然会触发类型不匹配的错误。
你原本想让play接收note (1/4) (A,4)这个完整的音乐值,所以需要明确让note先完成调用,再把结果传给play,有两种正确写法:
用
$运算符(优先级最低,确保右侧表达式先计算):play $ note (1/4) (A,4)(如果你确实写了这个但还是报错,大概率是输入时手滑漏了
$,再仔细检查下ghci里的输入)用括号明确包裹
note的调用:play (note (1/4) (A,4))
对比你能正常运行的play $ a 1 qn,这个写法是对的——a 1 qn会先返回一个Music值,$把它传给play,完全符合play的参数要求。
另外,也可以用书籍里提到的qn代替1/4,写法更简洁:
play $ note qn (A,4)
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

