如何实现可将任意值或Maybe值转为Maybe值的Haskell函数?
实现需求的
toMaybe函数 你需要启用几个GHC语言扩展来实现这个功能,具体步骤如下:
启用必要的扩展:
需要TypeFamilies、FlexibleInstances和OverlappingInstances这三个扩展,它们分别用于定义关联类型、允许更灵活的实例定义,以及让更具体的实例优先于泛化实例匹配。定义类型类和实例:
{-# LANGUAGE TypeFamilies, FlexibleInstances, OverlappingInstances #-} class ToMaybe a where type Out a toMaybe :: a -> Maybe (Out a) -- 针对Maybe类型的实例:直接返回原对象(用id实现) instance ToMaybe (Maybe a) where type Out (Maybe a) = a toMaybe = id -- 针对所有其他类型的实例:用Just包裹返回 instance ToMaybe a where type Out a = a toMaybe = Just main :: IO () main = do print $ toMaybe 3 -- 输出 Just 3 print $ toMaybe (Just 3) -- 输出 Just 3
- 原理说明:
- 当传入参数是
Maybe a类型时,会优先匹配第一个更具体的实例,直接返回原值; - 当传入其他类型时,会匹配第二个泛化实例,将参数用
Just包裹后返回。
- 当传入参数是
如果你使用的是GHC 8.0+版本,OverlappingInstances可以用Overlapping pragma替代,上述写法在新旧版本中都能正常运行。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

