show
(バイナリ)関数のメソッドを実装し、内部関数を区別できるようにしたいと思い(a -> a)
ます。
疑似haskellコードのようなもの:
instance Show (a->b) where
show fun = "<<Endofunction>>" if a==b
show fun = "<<Function>>" if a\=b
2つのケースをどのように区別できますか?
show
(バイナリ)関数のメソッドを実装し、内部関数を区別できるようにしたいと思い(a -> a)
ます。
疑似haskellコードのようなもの:
instance Show (a->b) where
show fun = "<<Endofunction>>" if a==b
show fun = "<<Function>>" if a\=b
2つのケースをどのように区別できますか?
いくつかの拡張機能を有効にする必要があります。
{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}
module FunShow where
instance Show ((->) a a) where
show _ = "<<Endofunction>>"
instance Show ((->) a b) where
show _ = "<<Function>>"
OverlappingInstances
インスタンスa -> b
は内部関数にも一致するため、重複があり、言語標準ではインスタンス宣言の型変数が異なることが義務付けられているため、必要ですFlexibleInstances
。
*FunShow> show not
"<<Endofunction>>"
*FunShow> show fst
"<<Function>>"
*FunShow> show id
"<<Endofunction>>"