在 Haskell 函数名称中,' 的含义是什么?

11

单引号 ' 用于什么?我已经阅读有关柯里化函数的内容并了解了定义 add 函数的两种方式 - 柯里化和非柯里化。柯里化版本...

myadd' :: Int -> Int -> Int
myadd' x y = x + y

...但是即使没有引号也能正常工作。那么'有什么意义呢?


1
你介意把它改名为“Haskell函数名称中'的含义”吗? - EFraim
1
可能是 Haskell 中标识符中的撇号 的重复问题。 - Don Stewart
5个回答

23

该引用对于Haskell来说没有意义,它只是该函数名称的一部分。

人们倾向于将其用于“内部”函数。如果您有一个通过使用累加器参数对列表求和的函数,则您的求和函数将使用两个参数。这很丑陋,因此您可以创建一个带有两个参数的sum'函数,以及一个带有一个参数的sum函数,例如sum list = sum' 0 list

编辑,也许我应该展示代码:

sum' s [] = s
sum' s (x:xs) = sum' (s + x) xs

sum xs = sum' 0 xs

你这样做是为了使sum'成为尾递归,并使“公共 API”看起来更加优美。


1
'sum' 可以在 'sum' 的 'where' 子句中。 - mk12
注意在递归函数中不要意外调用主函数,例如 sum' s (x:xs) = sum (s + x) xs。虽然类型系统会在这里发出警告,但如果函数具有相同的类型,则很难发现。 - mk12
通常它是指原始函数的稍微改变版本。 - Maximilian Mordig

17

它的发音通常为“普赖姆”,因此可以发音为“myadd prime”。它通常用于表示计算中的下一步或替代方案。

因此,您可以说:

add = blah
add' = different blah
或者
f x = 
  let x' = subcomputation x
  in blah.

这只是一种习惯,就像在Java、C等中使用int i作为for循环的索引一样。

编辑:我希望现在添加了所有词汇和代码格式后,这个答案会更有帮助。 :) 我总是忘记这不是所见即所得系统!


9
在这种情况下,'字符没有特定的意义; 它只是标识符的一部分。换句话说,myaddmyadd'是不同的、不相关的函数。
然而,按照惯例,'用于表示一些逻辑评估关系。因此,假设函数myaddmyadd'会有关联,使得可以从myadd推导出myadd'。这是从学术界(Haskell的根源所在)的形式逻辑和证明中推导出来的惯例。需要强调的是,这仅仅是一个惯例,Haskell不强制执行它。

6

单引号在Haskell名称中只是另一个允许的字符。它经常用于定义函数的变体,在这种情况下,单引号发音为“prime”。具体来说,Haskell库使用引号变体来显示变体是严格的。例如:foldl是惰性的,foldl'是严格的。

在这种情况下,看起来引号只是用于分隔柯里化和非柯里化的变量。


2
正如其他人所说,对于Haskell本身来说,'并没有任何意义。它只是一个字符,就像字母或数字一样。 '用于表示函数的替代版本(在foldlfoldl'的情况下)或辅助函数。有时,您甚至会在函数名上看到几个'。在函数名后面添加'比编写someFunctionHelpersomeFunctionStrict更加简洁。
这种符号的起源在数学和物理学中,如果您有一个函数f(x),它的导数通常表示为f'(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接