###「Phantom Type(幽霊型)入門ですー>ω<」なんだけど
#これのtailは動かないぞ
#deriving (Show)も手元ではアウトなんだが,それはいいとして.
#tailが動かない理由がどうもスッキリしなかったのでagdaで書いてみようとしたのがhpasteに貼ったやつ
#module normalのはVec的なやつで,どうやらstdlibのsafe head/tailをやってるのはtoVecとかで内実はVec A Natな形にしているみたい
#Vec的なやつだとVec A (suc n)のtailの型はそれ自体から計算できてVec A nになるので簡単なんだけど,このblogっぽい形にしようとするとtailの型が元のリストからは自明でないためと思われる.
#というのを確認したのがmodule specialの方なんだけど
#それにしてもこれもっとスッキリ書けないのでしょうか?
#最初はuniverse constructionになるんじゃないかと思ったのでcodeとかdecodeとか用意してたんだけど結局はうまくいかずtail's-codeというad hocなprivate function実装している.
#Haskellの方は http://hpaste.org/90139 に貼ったけどこっちはtailを実装できず. #誰か正解教えてください.
#圏論勉強会の流れからするとsemigroupあたりを使うのが一番キレイそうな気もするけど,それはまた別の話ってことで
#結局"何回安全にtailできるか"の情報が型から落ちちゃうとダメなので,Empty/NonEmptyだけのGADTだけではtailは書けないのでは?