Haskell 如何拥有多个一次性参数
我知道像这样的函数很常见Haskell 如何拥有多个一次性参数,haskell,idioms,Haskell,Idioms,我知道像这样的函数很常见 f _ [] = Nothing f a (x:xs) = ... 在Haskell中,\uuu是一次性参数名,这似乎是惯用的说法 如果我有很多我不在乎的东西呢?例如 g _ _ [] _ = Nothing g a _ (x:xs) b = ... 是我想写的,但我不认为我可以在一个定义中有多个 那么,当我不关心很多下划线时,我该怎么办呢?在同一个函数中肯定可以有多个下划线。因为它们没有指定任何值,所以它不会覆盖任何内容 它也更容易阅读,因为你知道它的价值
f _ [] = Nothing
f a (x:xs) = ...
在Haskell中,\uuu
是一次性参数名,这似乎是惯用的说法
如果我有很多我不在乎的东西呢?例如
g _ _ [] _ = Nothing
g a _ (x:xs) b = ...
是我想写的,但我不认为我可以在一个定义中有多个
那么,当我不关心很多下划线时,我该怎么办呢?在同一个函数中肯定可以有多个下划线。因为它们没有指定任何值,所以它不会覆盖任何内容
它也更容易阅读,因为你知道它的价值是什么并不重要,你可以关注到底是什么促成了结果。此外,如果在编译时启用所有警告,如果不使用具有名称的参数,则实际上会出现错误:
g a b = b
将返回一个警告:已定义但未使用:“a”
同一函数中肯定可以有多个下划线。因为它们没有指定任何值,所以它不会覆盖任何内容
它也更容易阅读,因为你知道它的价值是什么并不重要,你可以关注到底是什么促成了结果。此外,如果在编译时启用所有警告,如果不使用具有名称的参数,则实际上会出现错误:
g a b = b
将返回一个警告:已定义但未使用:'a'
当您尝试使用多个下划线时发生了什么?@MarcTalbot我不知道
在Haskell中是特殊的,我假设与其他编程语言一样
只是另一个有效标识符。在问这个问题之前,我没有尝试使用多个下划线,可能是因为我没有想到要这样做,或者我认为这是浪费时间,因为“无论如何都会出错”,或者我害怕即使它成功运行,我也会在某个地方搞砸其他东西(想象它克隆了第一个论点或其他东西)。我觉得先问比较舒服,对不起。你没什么可抱歉的(签出(。
的条目在它下面)。@onlygusti即使在。
只是另一个标识符的语言中,也没有(或者可能没有)问题。您可以编写。,,,,,,,,,,(“w”,“x”,“y”,“z”)例如,在Python中。@chepner我怀疑Haskell会抱怨,如果我做了f::Int->Bool->String->Int
,然后f a v a=…
。同样,Haskell类似于Python的元组分解赋值(a,a,a)=('a','b','c')
还有错误。我看不出您的Python示例与我的问题之间的比较:(当你尝试多个下划线时发生了什么?”MarcTalbot,我不知道代码“> <代码>在Haskell中是特殊的,我假设在其他编程语言<代码> < /C>只是另一个有效的标识符。在提问之前,我没有尝试多个下划线,可能我没有想到这样做,或者我想。我认为这是浪费时间,因为“它无论如何都会出错”,或者我害怕即使它成功运行,我也会在某个地方搞砸其他东西(想象它克隆了第一个参数或其他东西)。我觉得先问一声比较舒服,对不起。你没什么可抱歉的。:(签出(下面是\u
的条目).@theonlygusti即使在\uuu
只是另一个标识符的语言中,也没有(或可能没有)问题。您可以编写\uu、\uu、y、\u=(“w”、“x”、“y”、“z”)例如,在Python中。@chepner我怀疑Haskell会抱怨,如果我做了f::Int->Bool->String->Int
,然后f a v a=…
。同样,Haskell类似于Python的元组分解赋值(a,a,a)=('a','b','c')
还有错误。我看不出您的Python示例与我的问题之间的比较:(哦,我不知道它实际上是一种语言feature@theonlygusti是的,\u
的要点是,它是模式匹配中的一个通配符。我要补充的是,如果以下划线开头命名参数,可以避免最后的警告:\u a
。这是因为实际上是将值赋给变量,所以y实际上是分配的。使用Haskell laziness,您可能看不到差异,但您可以在计算中实际使用该变量,这与简单的underscore@AlexeyRomanov如果你试着运行f\u a=\u a
它会编译并运行,我不知道它实际上是一种语言feature@theonlygusti是的,_
是模式匹配中的一个通配符。我要补充的是,如果以下划线开头命名参数,则可以避免最后的警告:\u a
。这是因为实际上是将值分配给变量,所以实际上分配了内存。使用Haskell laziness,可能看不到区别,但实际上可以在计算中使用该变量,这与简单的underscore@AlexeyRomanov如果您尝试运行f\u a=\u a
,它将编译并工作