【问题标题】:What does ' mean/do at the end of function name in Haskell?Haskell中函数名末尾的'是什么意思/做什么?
【发布时间】: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

Source

【问题讨论】:

    标签: haskell syntax


    【解决方案1】:

    通常添加' 以表明这是函数map 的一些变体。它实际上只是名称的一部分(它是一个有效字符)。

    在此示例中,map 已由 Prelude 提供,因此您会遇到名称冲突。所以需要一个不同的名字,map' 不用想太多就可以完成这项工作。

    通常'表示该函数也是严格(例如foldl')。

    【讨论】:

    • 谢谢,所以我可以将此函数称为map'。感谢和抱歉这个愚蠢的问题
    • 这根本不是一个愚蠢的问题 - 一些学生将其与某种派生相关联(尤其是具有数学背景的学生;)) - 大多数其他语言不允许将字符用作其标识符,所以混乱是可以理解的
    • 是的,同意,与其他语言有点不同。感谢澄清这一点。
    【解决方案2】:

    字符'可以添加到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 with ^) Some other special variant, usually the Fourier transform of f, called "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 冲突。

    【讨论】:

    • 什么,你是在建议我停止调用我的变量_፞''፞''፞'፞
    • @leftaroundabout 是...是那些ETHIOPIC COMBINING VOWEL LENGTH MARKs 吗?我的终端在那些上中断:(
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2015-05-29
    • 2021-05-16
    • 2019-10-14
    • 2012-05-07
    • 2011-05-02
    • 2011-03-09
    相关资源
    最近更新 更多