首页 > 解决方案 > 是否可以返回一个依赖于 Maybe 类型值的函数

问题描述

假设我有一个简单的类型类,它模仿鸭式的真/假判断

class YesNo a where
    yesno :: a -> Bool

instance YesNo Int where
    yesno 0 = False
    yesno _ = True

instance YesNo Bool where
    yesno = id

是否有可能在遇到可能类型时检查可能中的类型是否实现了 yesno 类型类(如果它是 int 或 bool),然后基于此返回 True 或 False?

类似的东西

instance (YesNo a) => YesNo (Maybe a) where
    yesno (Just _) = yesno _
    yesno Nothing = False

感觉答案是否定的,因为它可能会破坏强类型的目的,但有人可以解释一下,因为这些概念对我来说仍然有点模糊。

标签: haskell

解决方案


是的,只需_用一些变量名替换,如x.

instance (YesNo a) => YesNo (Maybe a) where
    yesno (Just x) = yesno x
    yesno Nothing = False

感觉答案是否定的,因为它可能会破坏强类型的目的,但有人可以解释一下,因为这些概念对我来说仍然有点模糊。

实例定义只是说,Maybe ais an instance of YesNoif ais an instance of YesNo

当你调用yesnoon时,调用点Maybe a的函数必须知道那是一个实例。例如,您不能这样做:aYesNo

f :: a -> Bool
f a = yesno (Just a) -- error

你需要知道它aYesNo里面f,这样你就可以“传递”给yesno……</p>

f :: YesNo a => a -> Bool
f a = yesno (Just a) -- ok

推荐阅读