多めに植えておきました。

7666 byte

wvwwWWWwwvwwwWWWwwWwwWWWWwvwwwwWWWWwwWWWWwwwWwwwWWWwvwwwwWWWwwWWWWWwWwwwvwwWWWWW
WWwvwwWWwvwwWWwWWWwvwWWWWWwwWwwwWwwwvwWWWWWWwwwWwwwWwwwvwWWWWWWWwwwwWwwwWwwwvwWW
WWWWWWwwwwwWwwwWwwwvwWWWWWWWWWwwwwwwWwwwWwwwvwWWWWWWWWWWwwwwwwwWwwwWwwwvwwWWWWWW
WWWWWWWWWWwwvwwWWWWWWWWWWWWWWWWWwvwwwWwwwWwwwvwWwwwWWWwWWWwwwwwWWWWWWWWWWWWWWWWW
WWwWWWwvwWwwWWWWwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwWWWwWwwwwwwwwwvwwWwwwWwwwvwwWWwW
wwwwwwwwvwwWWwwwwwwwwwWwwvwWwwwwwwwwWwwwwwwwwwwvwWWWWWWWWWWWWWWWWWWWWWWWwwwwwwww
wWWwWwwwwwwwwwwwwvwwWWWWWWWwwWwwWWWWWwvwwWWWwwWwwWWWWWWWWWwWWWWWWwwwwWwwwwwwWWWw
vwwWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWwwwWwwWwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwvwwwwwWw
wwwwWwwwwwWwwwwwWwwwwwvwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwvwWwwvwwwwWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWwwwvwWwwvwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwvw
WwwvwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwvwWwwvwWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwW
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWw
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvwWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwvwWwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
wWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwW
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWw
WwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWwvWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWwvwWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWwwwWWWWWWWWWWW
WWwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWwwWWwwwwwwwwwwwwwww
WwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwWWWWwwwwwwwwwwwwwwwwwWwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWwwwwwwwwWwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwww
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwWWwWWWWWWWWWwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwww
wwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWwwwwwWwwwwwwwwwwWwwwwwWwwwwvwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWw
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWw
wwwwwWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWwv

今回はrichなdslを作った。単にmonadの力で殴っただけであるが、grassのgrassとしての面白さを覆い隠すには十分強力である。 もはや普通のlambda計算であるので、ただ書くだけである。

やはりesolang遊びにはhaskellは必須である。 関数適用の演算子が面倒であるが、これを解決するとするとlispで構造のparseから始めることになるので、許容されるべきものである。

ところでanarchy golfにfizzbuzzを提出しているのは私以外いない。プロたちはhelloworldを詰めて満足してしまったのだろうか。

module Main where
import Control.Exception
import Control.Monad
import Data.Bits
import Data.Char
import Data.Word

data Grass context a = Grass (Int -> (a, String, Int))
newtype Lambda = Lambda Int deriving (Eq, Ord, Show, Read)
data TopLevel
data Body

instance Functor (Grass context) where
    fmap f (Grass g) = Grass $ \ i ->
        let (a, s, j) = g i
            in (f a, s, j)
instance Applicative (Grass context) where
    pure a = Grass $ \ i -> (a, "", i)
    Grass f <*> Grass g = Grass $ \ i ->
        let (h, s, j) = f i
            (a, t, k) = g j
            in (h a, s ++ t, k)
instance Monad (Grass context) where
    Grass f >>= g' = Grass $ \ i ->
        let (a, s, j) = f i
            Grass g = g' a
            (b, t, k) = g j
            in (b, s ++ t, k)

define :: Int -> ([Lambda] -> Grass Body a) -> Grass TopLevel Lambda
define n f' =
    assert (n > 0) $
    Grass $ \ i ->
        let args = map Lambda [i..i+n-1]
            Grass f = f' args
            (_, s, _) = f (i+n)
            in (Lambda i, replicate n 'w' ++ s ++ "v", i+1)
apply :: Lambda -> Lambda -> Grass Body Lambda
apply (Lambda f) (Lambda x) = Grass $ \ i ->
    (Lambda i, replicate (i-f) 'W' ++ replicate (i-x) 'w', i+1)

runGrass :: Grass TopLevel a -> String
runGrass (Grass f) = let (_, s, _) = f l in s where
    l = length [gOut, gSucc, gW, gIn]

application :: Lambda -> Lambda -> Grass TopLevel Lambda
application f x = Grass $ \ i ->
    let Grass g = apply f x
        (a, s, j) = g i
        in (a, s ++ "v", j)

gIn :: Lambda
gIn = Lambda 0
gW :: Lambda
gW = Lambda 1
gSucc :: Lambda
gSucc = Lambda 2
gOut :: Lambda
gOut = Lambda 3

mDummy :: Grass context Lambda
mDummy = Grass $ \ i -> (Lambda (i - 1), "", i)

(<\\>) :: Lambda -> Lambda -> Grass Body Lambda
f <\\> g = apply f g
(</\>) :: Grass Body Lambda -> Lambda -> Grass Body Lambda
f </\> g = join $ liftM2 apply f (pure g)
(<//>) :: Grass Body Lambda -> Grass Body Lambda -> Grass Body Lambda
f <//> g = join $ liftM2 apply f g
(<\/>) :: Lambda -> Grass Body Lambda -> Grass Body Lambda
f <\/> g = join $ liftM2 apply (pure f) g
infixl 4 <\\>, </\>, <//>

main :: IO ()
main = putStrLn . runGrass $ do
    gI <- define 1 $ \ [_] -> return ()
    let ret a = gI <\\> a
    gK <- define 2 $ \ [x, _] -> ret x
    gSuccN <- define 3 $ \ [n, f, x] -> f <\/> (n <\\> f </\> x)
    gPlus <- define 4 $ \ [m, n, f, x] -> m <\\> f <//> (n <\\> f </\> x)
    gMult <- define 4 $ \ [m, n, f, x] -> m <\/> (n <\\> f) </\> x
    g0   <- define 2 $ \ [_, x] -> ret x
    g1   <- define 2 $ \ [f, x] -> f <\\> x
    g2   <- define 2 $ \ [f, x] -> f <\/> (f <\\> x)
    g4   <- define 1 $ \ [f] -> gMult <\\> g2 </\> g2  </\> f
    g8   <- define 1 $ \ [f] -> gMult <\\> g2 </\> g4  </\> f
    g16  <- define 1 $ \ [f] -> gMult <\\> g2 </\> g8  </\> f
    g32  <- define 1 $ \ [f] -> gMult <\\> g2 </\> g16 </\> f
    g64  <- define 1 $ \ [f] -> gMult <\\> g2 </\> g32 </\> f
    g128 <- define 1 $ \ [f] -> gMult <\\> g2 </\> g64 </\> f
    let mSum :: [Lambda] -> Grass Body Lambda
        mSum (x : xs) = foldl (\ a b -> gPlus <\/> a </\> b) (pure x) xs
        mSum [] = return g0
    let mN :: Word8 -> Grass Body Lambda
        mN n = mSum . map fst . filter snd . zip [g1, g2, g4, g8, g16, g32, g64, g128] $ map (testBit n) [0..7]
    let mC :: Char -> Grass Body Lambda
        mC c = mN (fromIntegral $ (ord c - ord 'w') `mod` 256) </\> gSucc </\> gW
    gTrue  <- define 2 $ \ [t, _] -> ret t
    gFalse <- define 2 $ \ [_, f] -> ret f
    gPair <- define 3 $ \ [a, b, p] -> p <\\> a </\> b
    let mFst p = p <\\> gTrue
    let mSnd p = p <\\> gFalse
    gPredN <- do
        helper <- define 1 $ \ [p] -> gPair <\/> mSnd p <//> (gSuccN <\/> mSnd p)
        define 1 $ \ [n] -> mFst =<< (n <\\> helper <//> (gPair <\\> g0 </\> g0))
    gMinus <- define 2 $ \ [n, m] -> m <\\> gPredN </\> n
    gAnd <- define 2 $ \ [p, q] -> p <\\> q </\> gFalse
    gOr  <- define 2 $ \ [p, q] -> p <\\> gTrue </\> q
    gNot <- define 1 $ \ [p] -> p <\\> gFalse </\> gTrue
    gIsZero <- define 1 $ \ [n] -> n <\/> (gK <\\> gFalse) </\> gTrue
    gLe <- define 2 $ \ [m, n] -> gIsZero <\/> (gMinus <\\> m </\> n)
    gEq <- define 2 $ \ [m, n] -> gAnd <\/> (gLe <\\> m </\> n) <//> (gLe <\\> n </\> m)
    gSuccMod <- define 2 $ \ [p, n] -> do
        n' <- gSuccN <\\> n
        (gEq <\\> p </\> n') </\> g0 </\> n'
    gPair4 <- define 5 $ \ [a, b, c, d, p] -> p <\\> a </\> b </\> c </\> d
    gPi41 <- do
        helper <- define 4 $ \ [a, _, _, _] -> ret a
        define 1 $ \ [p] -> p <\\> helper
    gPi42 <- do
        helper <- define 4 $ \ [_, b, _, _] -> ret b
        define 1 $ \ [p] -> p <\\> helper
    gPi43 <- do
        helper <- define 4 $ \ [_, _, c, _] -> ret c
        define 1 $ \ [p] -> p <\\> helper
    gPi44 <- do
        helper <- define 4 $ \ [_, _, _, d] -> ret d
        define 1 $ \ [p] -> p <\\> helper
    gFizz <- define 1 $ \ [a] -> do
        void $ gOut <\/> mC 'F'
        void $ gOut <\/> mC 'i'
        void $ gOut <\/> (gOut <\/> mC 'z')
        ret a
    gBuzz <- define 1 $ \ [a] -> do
        void $ gOut <\/> mC 'B'
        void $ gOut <\/> mC 'u'
        void $ gOut <\/> (gOut <\/> mC 'z')
        ret a
    gNewline <- define 1 $ \ [a] -> do
        void $ gOut <\/> mC '\n'
        ret a
    gDigit <- define 1 $ \ [n] -> n <\\> gSucc <//> mC '0'
    g3  <- application gSuccN g2
    g5  <- application gSuccN g4
    g9  <- application gSuccN g8
    g10 <- application gSuccN g9
    gFizzBuzz <- define 1 $ \ [p] -> do
        a <- gPi41 <\\> p  -- n / 10
        b <- gPi42 <\\> p  -- n % 10
        c <- gPi43 <\\> p  -- n % 3
        d <- gPi44 <\\> p  -- n % 5
        isFizz <- gIsZero <\\> c
        isBuzz <- gIsZero <\\> d
        void $ (isFizz <\\> gFizz </\> gI) <//> mDummy
        void $ (isBuzz <\\> gBuzz </\> gI) <//> mDummy
        isNum <- gNot <\/> (gOr <\\> isFizz </\> isBuzz)
        void $ ((gAnd <\\> isNum <//> (gNot <\/> (gIsZero <\\> a))) </\> gOut </\> gI) <//> (gDigit <\\> a)
        void $ (isNum <\\> gOut </\> gI) <//> (gDigit <\\> b)
        void $ gNewline <\/> mDummy
        b' <- gSuccMod <\\> g10 </\> b
        a' <- ((gIsZero <\\> b') </\> gSuccN </\> gI) </\> a
        c' <- gSuccMod <\\> g3  </\> c
        d' <- gSuccMod <\\> g5  </\> d
        gPair4 <\\> a' </\> b' </\> c' </\> d'
    define 1 $ \ [_] ->
        mN 100 </\> gFizzBuzz <//> (gPair4 <\\> g0 </\> g1 </\> g1 </\> g1)

Grassでfizzbuzzを書いた

この記事はKobeUniv Advent Calendar 2015の1日目の記事として書かれました。 前々からgrassはやりたいなと思ってはいたが、特に書く機会もなかったのでちょうどよかったように思います。