我想实现show
(二进制)函数的方法并使其能够区分 endofunctions (a -> a)
。
类似于伪haskell代码的东西:
instance Show (a->b) where
show fun = "<<Endofunction>>" if a==b
show fun = "<<Function>>" if a\=b
如何区分这两种情况?
我想实现show
(二进制)函数的方法并使其能够区分 endofunctions (a -> a)
。
类似于伪haskell代码的东西:
instance Show (a->b) where
show fun = "<<Endofunction>>" if a==b
show fun = "<<Function>>" if a\=b
如何区分这两种情况?
您需要启用一些扩展:
{-# LANGUAGE OverlappingInstances, FlexibleInstances #-}
module FunShow where
instance Show ((->) a a) where
show _ = "<<Endofunction>>"
instance Show ((->) a b) where
show _ = "<<Function>>"
您需要OverlappingInstances
,因为实例a -> b
也匹配 endofunctions,因此存在重叠,并且您需要FlexibleInstances
因为语言标准要求实例声明中的类型变量是不同的。
*FunShow> show not
"<<Endofunction>>"
*FunShow> show fst
"<<Function>>"
*FunShow> show id
"<<Endofunction>>"