haskell - 在类 Functor 的声明中,类型变量可以是函数类型吗?
问题描述
在 Haskell 中,类Functor
被声明为:
class Functor f where
fmap :: (a -> b) -> f a -> f b
类型变量可以是函数类型,a
还是b
必须是非函数类型?
如果它们可以是函数类型,那么在能够应用于具有任意数量参数的函数方面,是不是实际上 classFunctor
变得与 class 相同?根据Hutton在 Haskell 中的编程所说:Applicative
fmap
函子抽象了
fmap
将函数映射到结构的每个元素上的想法。应用程序将这个想法推广到允许fmap
映射具有任意数量参数的函数,而不是仅限于具有单个参数的函数。
在应用中:
fmap0 :: a -> f a fmap0 = pure fmap1 :: (a -> b) -> f a -> f b fmap1 g x = pure g <*> x fmap2 :: (a -> b -> c) -> f a -> f b -> f c fmap2 g x y = pure g <*> x <*> y fmap3 :: (a -> b -> c -> d) -> f a -> f b -> f c -> f d fmap3 g x y z = pure g <*> x <*> y <*> z
类Applicative
声明为:
class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b
谢谢。
解决方案
可以类型变量
a
和b
函数类型
- 好,当然。
是不是班级
Functor
变得实际上与班级相同Applicative
不,绝对不是。如果您将函数类型插入a
或签名中,您会得到类似b
的fmap
东西
fmap :: ((x -> y) -> b) -> f (x -> y) -> f b
或者
fmap :: (a -> p -> q) -> f a -> f (p -> q)
但至关重要的是,fmap
总是只取一个f _
包装值并准确地吐出一个这样的值。Applicative
同时允许你接受任意数量的包装值,只要你给它一个函数来处理包含的值。
推荐阅读
- flutter - 颤振 dio 或 http 在某些模拟器上不起作用
- python - 范妮的遭遇
- database - 在数据库更新过程中绕过缓存
- ios - Xcode 上不同的编译时间 - clang
- hibernate - 查询获取 HQL 中特定列的计数
- php - 显示经纬度的地图不起作用
- c# - 以下需要正则表达式
- visual-studio-code - 为什么一对括号内的单词被视为vsvim中的单词?
- r - 使用梯度和 hessian 矩阵手动计算 pglm 的稳健标准误差
- php - symfony CollectionType -> 如何在没有任何实体的情况下手动向 CollectionType 添加字段?