haskell - 是否可以返回一个依赖于 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
感觉答案是否定的,因为它可能会破坏强类型的目的,但有人可以解释一下,因为这些概念对我来说仍然有点模糊。
解决方案
是的,只需_
用一些变量名替换,如x
.
instance (YesNo a) => YesNo (Maybe a) where
yesno (Just x) = yesno x
yesno Nothing = False
感觉答案是否定的,因为它可能会破坏强类型的目的,但有人可以解释一下,因为这些概念对我来说仍然有点模糊。
实例定义只是说,Maybe a
is an instance of YesNo
if a
is an instance of YesNo
。
当你调用yesno
on时,调用点Maybe a
的函数必须知道那是一个实例。例如,您不能这样做:a
YesNo
f :: a -> Bool
f a = yesno (Just a) -- error
你需要知道它a
在YesNo
里面f
,这样你就可以“传递”给yesno
……</p>
f :: YesNo a => a -> Bool
f a = yesno (Just a) -- ok
推荐阅读
- docusignapi - 向 Docusign 中的所有文档添加选项卡
- git - github - 降级后无法解决冲突和合并
- excel - VBA在满足条件时将特定单元格从一个工作表复制到另一个工作表
- c# - 如何使用/何时使用可空类型打开类型?
- python - Matplotlib 颜色条未显示 2 个离散值的标签
- python-3.x - Python 将 .tar.gz 文件添加到库中
- image-recognition - 检测烛台形态
- html - 为什么我的导航在开发工具和移动设备上显示不同
- python - 大图的dijkstra算法
- java - 存在 module-info.java 文件时无法访问 JavaFX 16 中的资源文件