Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何拥有多个一次性参数_Haskell_Idioms - Fatal编程技术网

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
,它将编译并工作