fro*_*h03 5 haskell functional-programming typeclass
有没有办法进一步约束现有类型类的上下文?
例如,类型类Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
此类定义不强制执行a或b作为其元素Show.此类型类也是我自己包含的类,因此我无法影响类定义.它仍然是可能的,到后来只允许a的,并且b是,那是会员Show?
Dan*_*her 11
不是直接的.如果不更改源和重新编译,则无法更改类的定义.对于标准库中定义的类,这会导致代码严重破坏,因此不是一个现实的选择.
但是,您可以打包该类并添加所需的约束,
class Functor f => ShowFunctor f where
smap :: (Show a, Show b) => (a -> b) -> f a -> f b
smap f = fmap f
Run Code Online (Sandbox Code Playgroud)
然后使用该类而不是原始类.
但也许您不需要额外的类,对于您的应用程序smap,只需在顶层定义并简单地使用它而不是fmap,
smap :: (Functor f, Show a, Show b) => (a -> b) -> f a -> f b
smap = fmap
Run Code Online (Sandbox Code Playgroud)