続続・ゆの in Haskell

自分でもよく飽きないなーと思いますが、またしてもゆのネタです。

私のアタマではどう頑張っても正式なゆの式を書くことができなかったので、AAに関しては激しく妥協しつつ、別方向で変態的なコードを作ろうとしてみました。その結果が以下です。

import Prelude hiding ((<),(/),(-))
import Data.List (intersperse)
import Debug.Trace (trace)

data X = X | I | X :/ X | X :< String
class    P a    where p :: a
instance P X    where p = I
instance P Bool where p = False

risk = "Hidamari"
etc  = "Sketch"
infixr 3 -
infixr 6 /
infixr 5 <
_ < h=id ama risk etc h 365
  where
    ama a b c d = trace (concat$intersperse " " [a,b,show d,c]) p
I - _  = I
_ - _  = I/X
_ <: _ = True
__ = I
k  = (X <)
main :: IO X
main = return$!


 X / __ / X :< "Hello, World!"

X / _ | X   <: "Are you happy?"=

 X:/ __ / X :< "Yahoooo!"-

 X ; _ / X  =k "See you next week!"


X:/ _ / X :<  ~"Yuno in Haskell"=  X:/ __ / X
_/_=__

これは何かというと、main の下の4人のゆのモドキをそれぞれ喋らせる遊びです。
上記のコードはデフォルトでは4番目だけが喋ります。
その上の三人の「:<」または「<:」のひとつを「<」に書きかえると、そいつだけが喋るようになります。

解説

頑張って読もうとする人はあまりいないと思いますが一応簡単に解説しておくと、パターンマッチのような感覚で上から順に見ていって、< が出た時点で4番目のパターンに引っかからなくなります。
< の戻り型は X にも Bool にもなるので型クラスでまとめています。あと遅延パターンを _ の代わりとして使ってます。

main の中身と / の定義を両方ゆのにしようと思って書きはじめたら : で始まる演算子はコンストラクタとして使えることを思い出してゴニョゴニョしてたらこんなコードになってしまいました。

ゆの in language は言語によって難易度が全然違うので、簡単にできる言語で縛りプレイを楽しむのも自由、実現が難しい言語での妥協点を探すのも自由だと思います。楽しめればいいんです。みんなもっと変態コード書こうよ!