功能名称

时间:2017-11-01 08:02:42

标签: haskell

我只是看看clojure,并在示例页面上找到以下代码行

(filter even? [1 2 3])

虽然这是相当标准的代码我很惊讶这个事实,他们使用'?'使谓词更容易阅读。

是否也可以让haskell接受这个作为函数名称? 到目前为止,我发现https://wiki.haskell.org/Unicode-symbols遗憾的是不包含'?'。

3 个答案:

答案 0 :(得分:3)

来自Haskell 2010语言报告(https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-180002.4):

  

varid→(small {small | large | digit |'})⟨reservedid⟩

  

下划线,“_”被视为小写字母,可以出现在小写字母的任何地方。但是,“_”本身就是一个保留的标识符,在模式中用作外卡。

换句话说,标识符必须以小写字母或_开头,并且只能包含小写字母,_,大写字母,数字和'

我不知道任何语言扩展会允许这样做。此外,它会强制这样一个模块的用户启用扩展,所以我不相信这是一个好主意。 Haskell代码中的约定是调用类似isEven的函数,这是代码的用户无论如何都会期望的。 (https://en.wikipedia.org/wiki/Principle_of_least_astonishment

答案 1 :(得分:2)

不要这样做。

总黑客:?不是有效的标识符字符,但ʔ是。

请勿使用以下内容。

evenʔ :: Num a => a -> Bool
evenʔ 0 = True
evenʔ 1 = False
evenʔ n = evenʔ (n - 2)

ʔ当然是U + 0294 LATIN LETTER GLOTTAL STOP,除了外观,它与U + 003F QUESTION MARK完全无关。)

我提到你不应该这样做吗?

答案 2 :(得分:0)

在Haskell中,我们不能在变量名中使用?,除非使用特定的扩展名Implicit Parameters,但它会改变变量的范围规则。

使用该扩展名,变量名称可以包含前导问号,如?foo中所示。但是,这会将foo标记为隐式参数。例如:

f :: (?x :: Int) => Int -> Int
f y = ?x + y   -- x is in scope here

main :: IO ()
main = do
   let ?x :: Int
       ?x = 23
   print (f 10)   -- ?x is also passed, implicitly

基本上,这会使?x具有动态而非静态/词汇范围。

在实践中,这是一个最常用的扩展。 (不过我仍然觉得很高兴。)

这肯定是你想要什么,但也许值得一提。如果您在Haskell中看到带有前导?的名称,请知道它们非常特殊。