ということで、Smalltalkでは、FizzBuzzを書くのにモナド的な視点で逃げをうってみた


経緯は id:terazzoさんのところでまとめてくださっています。


で、こちらのほぼタイトルだけをヒントにして、そうか、一連の処理を一方通行のモナド的にとらえるなら、Haskell でいうところの show を再定義してしまうことで、たとえば 15 fizz buzz value の最後の value とかいらないね、と。まあ、当初のもくろみ(関数みたく fizz buzz というメッセージを合成して送りたい!)からすれば、逃げ方を変えただけの負けは負けなんですけれども、案外、シンプルに書けてよさそうだったので、つい。^^;

Integer>>asFizzBuzzAssoc
   ^FizzBuzzAssoc key: self value: ''

Integer>>fizz
   ^self asFizzBuzzAssoc fizz

Integer>>buzz
   ^self asFizzBuzzAssoc buzz
Association subclass: #FizzBuzzAssoc

FizzBuzzAssoc>>fizz
   (key isDivisibleBy: 3) ifTrue: [value := value, 'Fizz']

FizzBuzzAssoc>>buzz
   (key isDivisibleBy: 5) ifTrue: [value := value, 'Buzz']

FizzBuzzAssoc>>printOn: aStream
   (value ifEmpty: [key]) printOn: aStream

使用例

(1 to: 15) collect: [:n | n fizz buzz]
=> {1 . 2 . 'Fizz' . 4 . 'Buzz' . 'Fizz' . 7 . 8 . 'Fizz' . 'Buzz' . 11 . 'Fizz' . 13 . 14 . 'FizzBuzz'}


参考