Function 什么';Haskell中函数和函子的区别是什么?唯一的定义?
在Haskell中,当编写函数时,它意味着我们将某个东西(输入)映射到另一个东西(输出)。我试着去理解函子的定义:看起来和普通函子一样Function 什么';Haskell中函数和函子的区别是什么?唯一的定义?,function,haskell,functor,difference,Function,Haskell,Functor,Difference,在Haskell中,当编写函数时,它意味着我们将某个东西(输入)映射到另一个东西(输出)。我试着去理解函子的定义:看起来和普通函子一样 函数被称为函子有什么限制吗 函子是否允许有I/O或任何其他副作用 如果在Haskell中,“一切都是函数”,那么引入“函子”概念有什么意义呢?功能的受限版本,还是功能的增强版本 非常困惑,需要你的建议。 谢谢。首先,Haskell中的“一切都是函数”不是真的。很多东西都不是函数,比如4。或者字符串“vik santata” 在Haskell中,函数是将一些输入映
谢谢。首先,Haskell中的“一切都是函数”不是真的。很多东西都不是函数,比如
4
。或者字符串“vik santata”
在Haskell中,函数是将一些输入映射到输出的东西。函数是一个可以应用于其他值以获得结果的值。如果一个值的类型中有一个->
,那么它很可能是一个函数(但是这个经验法则有无限多的例外;-)
以下是一些功能示例(引自GHCI会议):
以下是一些非函数的例子:
- 一个(多态)值,可以假定任何类型
,前提是该类型是A
类的成员(例如Num
将是有效类型)。确切的数值将从数字的使用方式推断出来 请注意,此类型中有Int
,这与=>
完全不同。它表示“类约束”->
- 函数列表。请注意,它的类型中有一个
,但它不是顶级类型构造函数(顶级类型是->
,即“列表”):[]
fmap
函数一起使用(并由其返回)的类型(前提是fmap
函数符合某些规则,通常称为“定律”)。您可以使用GHCI找到属于Functor
的基本类型列表:
λ: :i Functor
[...]
instance Functor (Either a) -- Defined in ‘Data.Either’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
[...]
这意味着您可以将fmap
应用于列表,或者可能
值,或者任何一个
值。实际上,a是两个函数,但其中只有一个是Haskell函数(我不确定它是否是您怀疑的函数)
*
的类型,并且函子将此类类型映射到其他类型。您可以使用:kind
查询在ghci中看到函子的这一方面:
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k []
[] :: * -> *
Prelude> :k IO
IO :: * -> *
这些函数的作用相当无聊:例如,它们映射
到Int
可能是Int
到()
IO()
到String
[[Char]]
Int
,作为单个实体映射到类型可能是Int
此函数是通过
fmap
获得的:
fmap::(Int->Double)->(可能Int->Double)
fmap::(()->Bool)->(IO()->IO Bool)
fmap::(Char->String)->String->[String]
要使某些东西成为函子,需要两件事:
- 容器类型*
- 将函数从容器转换为函数转换容器的特殊函数
Functor
的“接口”中,转换函数已命名为fmap
因此,您总是从以下内容开始
data Maybe a = Just a | Nothing
instance Functor Maybe where
-- fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f (Just a) = Just (f a)
fmap _ Nothing = Nothing
另一方面,函数不需要容器来工作,因此它们与函子没有这种关系。另一方面,每个函子都必须实现函数fmap
,才能赢得自己的名字
此外,约定要求函子
遵守某些规则,但这不能由编译器/类型检查器强制执行
*:此容器也可以是幻影类型,例如数据代理a=Proxy
在这种情况下,容器的名称是有争议的,但我仍然会使用该名称
“Hello World”
,(3::Int,'a')
,以及只是“x”
。类型包括=>
的对象也不一定是函数,尽管GHC(通常)在其中间表示中将它们转换为函数函子
类表示inje
λ: :i Functor
[...]
instance Functor (Either a) -- Defined in ‘Data.Either’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
[...]
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k []
[] :: * -> *
Prelude> :k IO
IO :: * -> *
data Maybe a = Just a | Nothing
instance Functor Maybe where
-- fmap :: (a -> b) -> Maybe a -> Maybe b
fmap f (Just a) = Just (f a)
fmap _ Nothing = Nothing