' 在 Haskell 函数名的末尾是什么意思/做什么?

时间:2021-04-22 10:51:12

标签: haskell syntax

几天前我开始使用 Haskell,我在网上找到了一些解决我的问题的方法,但我开始注意到某些函数在函数名称的末尾有一个符号。

什么意思?

一个例子可能是

map'            :: (a -> b) -> [a] -> [b]
map' f []       = []
map' f (x:xs)   = foldr (\y ys -> (f y):ys) [] xs

Source

2 个答案:

答案 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 with ^) 其他一些特殊的变体,通常是f的傅立叶变换,称为“f hat”

在 Haskell 中,素数通常表示一个

  • 严格的变体(例如foldl'),
  • 自定义实现(例如,您自己代码中的 map',因为它与 Prelude.map 冲突),
  • 从另一个值派生的值(例如 x' = go x)或
  • 一个内部函数(库中的一个实现细节)

特别是第三个变体经常出现在 wherelet 子句中。毕竟命名很难,一个素数可以让你既显示值的来源,又不需要想出更好的名字:

-- | '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 发生冲突。