几天前我开始使用 Haskell,我在网上找到了一些解决我的问题的方法,但我开始注意到某些函数在函数名称的末尾有一个符号。
什么意思?
一个例子可能是
map' :: (a -> b) -> [a] -> [b]
map' f [] = []
map' f (x:xs) = foldr (\y ys -> (f y):ys) [] xs
答案 0 :(得分:7)
通常添加 '
以表明这是函数 map
的一些变体。它实际上只是名称的一部分(它是一个有效字符)。
在此示例中,map
已由 Prelude
提供,因此您会遇到名称冲突。因此需要一个不同的名称,map'
无需考虑太多即可完成这项工作。
通常 '
表示该函数也是 strict(例如 foldl'
)。
答案 1 :(得分:6)
字符 '
可以添加到 Haskell 中的任何标识符,所以 map'
是一个标识符。在这种情况下,'
is also called "prime",因此,如果您大声朗读 map'
,它的发音将是“map prime”。
使用源于数学,其中函数变体(通常是它们的导数)附有某种符号,例如
功能 | 含义 |
---|---|
f | 原函数 |
f' | f | 的导数
f'' | 二阶导数f |
f* | f 的一些特殊变体(通常称为 “f star”) |
f̂ (f with ^) | 其他一些特殊的变体,通常是f的傅立叶变换,称为“f hat”。 |
在 Haskell 中,素数通常表示一个
foldl'
),map'
,因为它与 Prelude.map
冲突),x' = go x
)或特别是第三个变体经常出现在 where
或 let
子句中。毕竟命名很难,一个素数可以让你既显示值的来源,又不需要想出更好的名字:
-- | 'pow x n' calculates 'x' to the power of 'n'.
-- It uses the double-and-add method internally
pow :: Int -> Int -> Int
pow x 0 = 1
pow x 1 = x
pow x n
| even n = x' * x' -- usage of 'pow x (n/2)' here
| otherwise = x' * x' * x -- use of both x' and x
where
x' = pow x (n `div` 2) -- x' stems from the original x
请注意,您的标识符中可能有任意多个 '
:
some'strange'example'don't'do'this :: Int
some'strange'example'don't'do'this = 12
foo'''''''''''''' = "please don't do this :)"
不允许在标识符的开头使用单引号,因为它会与通常的 Char
发生冲突。