haskell - 为什么我们要在实例中定义函数?
问题描述
instance Functor Maybe where
-- fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f Nothing = Nothing
fmap f (Just item) = Just (f item)
如果我们在实例之外定义 fmap,我们仍然可以将它应用到 Functor Maybe。我们在实例中定义它有什么目的吗?
解决方案
我们为我们想要的任何类型定义一个Functor
typeclass 的实例(这是有意义的),然后我们可以为任何这些类型使用同名函数“ fmap
”。实际功能在每种情况下都会有所不同,instance
具体取决于类型类(此处为Functor
)的方法(此处只有一个方法,名为)的实际类型实现(又名“” fmap
)。
就像+
整数和复数(以及矩阵等)是两个不同的函数一样,fmap
. “在概念上”它是相同的,但在每种情况下它的实际作用是不同的。
如果我们在实例之外定义“fmap”,我们以后就不能为另一种类型重新定义它——这个名字已经被占用了。只有类型类的方法才允许我们对相关但不同的操作使用相同的名称来处理各种相关但不同的类型。
推荐阅读
- rxjs - 将一个发射分成几个
- optimization - 现有的 MODX 延迟加载
- ruby-on-rails - 如何在 FastJsonAPI 中将参数从控制器传递到序列化程序?
- asynchronous - java.lang.ClassNotFoundException:使用 camelahc 组件时未找到 org.reactivestreams.Publisher
- python - 使用 raw_input() 时在目录中查找文件的 python 选项卡功能
- c# - 具有依赖关系的 AddTransient
- sql-server - TFS 数据库增长迅速
- android - 如何在迁移期间删除未被任何其他对象引用的 Realm 对象?
- javascript - 如何获取指向 javascript 对象属性的链接数
- r - 过滤(dplyr)数据帧的R str函数