【发布时间】:2021-04-22 10:51:12
【问题描述】:
几天前我开始使用 Haskell,我在网上找到了一些解决我的问题的方法,但我开始注意到某些函数在函数名的末尾有一个符号。
什么意思?
一个例子可以是
map' :: (a -> b) -> [a] -> [b]
map' f [] = []
map' f (x:xs) = foldr (\y ys -> (f y):ys) [] xs
【问题讨论】:
几天前我开始使用 Haskell,我在网上找到了一些解决我的问题的方法,但我开始注意到某些函数在函数名的末尾有一个符号。
什么意思?
一个例子可以是
map' :: (a -> b) -> [a] -> [b]
map' f [] = []
map' f (x:xs) = foldr (\y ys -> (f y):ys) [] xs
【问题讨论】:
通常添加' 以表明这是函数map 的一些变体。它实际上只是名称的一部分(它是一个有效字符)。
在此示例中,map 已由 Prelude 提供,因此您会遇到名称冲突。所以需要一个不同的名字,map' 不用想太多就可以完成这项工作。
通常'表示该函数也是严格(例如foldl')。
【讨论】:
map'。感谢和抱歉这个愚蠢的问题
字符'可以添加到Haskell中的任何标识符,所以map'是一个标识符。在这种情况下,' is also called "prime",所以 map' 如果你要大声读出来,就会读作“地图素数”。
使用源于数学,其中函数变体(通常是它们的导数)附有某种符号,例如
| Function | Meaning |
|---|---|
| f | Original function |
| f' | Derivative of f |
| f'' | Second derivative f |
| f* | Some special variant of f (usually called "f star") |
| f̂ (f with ^) | Some other special variant, usually the Fourier transform of f, called "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 冲突。
【讨论】:
_፞''፞''፞'፞?
ETHIOPIC COMBINING VOWEL LENGTH MARKs 吗?我的终端在那些上中断:(