我只是看看clojure,并在示例页面上找到以下代码行
(filter even? [1 2 3])
虽然这是相当标准的代码我很惊讶这个事实,他们使用'?'使谓词更容易阅读。
是否也可以让haskell接受这个作为函数名称? 到目前为止,我发现https://wiki.haskell.org/Unicode-symbols遗憾的是不包含'?'。
答案 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中看到带有前导?
的名称,请知道它们非常特殊。