【Tidal Cycles・Haskell】パターンマッチの記法に気づけなかった
最近こちらの書籍を読みながらTidal Cyclesで遊んでいます。
その中で謎に思えた記法があったのでメモ。
Tidal Cyclesとは
TidalCyclesは、音楽の即興演奏と作曲のために設計されたライブコーディング環境です。特に、Haskellに埋め込まれたドメイン固有言語であり、可聴パターンまたは視覚パターンの生成と操作に重点を置いています。 (ウィキペディアより)
理解できなかった記法
Tidal CyclesはHaskellを利用するのですが、下記のコードが不思議でした。
do let inverse 1 = 0 inverse 0 = 1 pat1 = "{1 0 0 1 0 1 0 1/2 1 0 0 1/3}%8" d1 $ gain pat1 # s "bd" d2 $ gain (inverse <$> pat1) # sound "cp"
inverse 0
と inverse 1
という変数を定義して〜(ここから間違ってる)。
d1ではキックをならし、d2でクラップを鳴らす。
$ gain (inverse <$> pat1)
で、pat1の値を渡して。。
????
let inverse 1 = 0 inverse 0 = 1 ・ ・ ・ $ gain (inverse <$> pat1)
この挙動がよく分かりませんでした。 本の中では「patが0のときは1を、1のときは0を返すのでbdが鳴っていないときにcpが鳴る」的なことが書かれていたのですが、理屈が分からず困惑しました。
そもそも変数のような書き方じゃないぞこれは。
let inverse 1 = 0 inverse 0 = 1
fmap
調べると<$>
はfmapと呼ばれ、ここではpat1を回して前述のinverse
に引数を渡すような動きになる。
$ gain (inverse <$> pat1)
ということはinverseは変数ではない、関数か。
(後から本を読み返したらちゃんと「関数」と書いてありました・・。)
パターンマッチだった
https://www.tohoho-web.com/ex/haskell.html#pattern_match
答えはパターンマッチ!ということでした。
分からなかった!
let -- 1を受け取ったら0を返す inverse 1 = 0 -- 0を受け取ったら1を返す inverse 0 = 1
にしてもRubyの場合3系からパターンマッチが導入されたりと触れる機会が少ないと感じていたのですが、どうやら関数型言語だとよくあるそうです。
普段はオブジェクト指向の言語を触っているせいか、関数型言語は難しく感じるな〜〜〜。
おわり。