在 Haskell 中,当编写函数时,这意味着我们将某个东西(输入)映射到另一个东西(输出)。我尝试 LYAH 来理解 Functor 的定义:看起来和普通 Functor 一样。
- 函数被称为函子有什么限制吗?
- Functor 是否允许有 I/O 或任何其他副作用?
- 如果在Haskell中,“一切都是函数”,那么引入“Functor”概念的意义何在?功能的限制版本,还是功能的增强版本?
很困惑,需要大家的建议。
谢谢。
首先,Haskell 中的“一切都是函数”是不正确的。很多东西都不是函数,比如4
。或者字符串"vik santata"
.
在 Haskell 中,函数是将某些输入映射到输出的东西。函数是一个值,您可以将其应用于其他值以获得结果。如果一个值有一个->
就其类型而言,它很可能是一个函数(但这条经验法则有无限多的例外;-))。
以下是一些函数示例(引用自 GHCI 会话):
λ: :t fst
fst :: (a, b) -> a
λ: :t even
even :: Integral a => a -> Bool
以下是一些非函数的示例:
-
可以采用任何类型的(多态)值a
前提是该类型是该类型的成员Num
类(例如Int
将是一个有效的类型)。确切的值可以根据数字的使用方式推断出来。
请注意,该类型有=>
其中,这与->
。它表示“类约束”。
λ: :t 5
5 :: Num a => a
-
函数列表。请注意,这有一个->
在其类型中,但它不是顶级类型构造函数(顶级类型是[]
,即“列表”):
λ: :t [fst, snd]
[fst, snd] :: [(a, a) -> a]
Functors不是可以应用于价值观的东西。函子是其值可以与 一起使用(并由其返回)的类型fmap
函数(前提是fmap
函数遵守某些规则,通常称为“法律”)。您可以找到属于以下类型一部分的基本类型列表Functor
使用 GHCI:
λ: :i Functor
[...]
instance Functor (Either a) -- Defined in ‘Data.Either’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
[...]
这意味着您可以申请fmap
到列表,或到Maybe
值,或Either
values.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)