在 Elm 中,_ 是什么意思?

6

我在查看http://elm-lang.org/examples/zip上的zip示例,对于Elm中的_具体代表什么有疑问。

zip : List a -> List b -> List (a,b)
zip xs ys =
   case (xs, ys) of
    ( x :: xs', y :: ys' ) ->
        (x,y) :: zip xs' ys'

    (_, _) ->
        []

我的直觉是它的意思是“其他所有东西”,但这是否意味着任何有效的值?如果没有值怎么办?


1
如Dennis Reimann在这篇文章中所述,使用_可以定义占位符,用于忽略或跳过某些值。 - Tyler Benzing
1个回答

9

_ 用于匹配任何你不关心其值的内容,因此通常用于匹配“其他所有”情况。

在你的示例代码中,(_, _) 将匹配任何有两个值的元组。请注意,它也可以被替换为只是 _,因为你最终不关心任何一个值。更形象的例子是,当你关心元组中的一个值而不关心另一个值时,例如实现 fst 在核心包中

fst : (a,b) -> a
fst (a,_) =
  a

我们不关心元组中的第二个值,所以它只需与该位置上的 _匹配。
Elm 中没有 nullundefined,因此您不必担心不存在“无值”的情况(如果某物没有值,则使用 Maybe 类型)。

谢谢解释!在这个压缩示例中,由于 List a 和 List b 可能具有不同的长度,( _ , _ ) 情况是否也处理了 a 或 b 长度不同时的情况?如果是这样,那么其中一个 "_" 的值是否不存在? - wmock
是的,如果不符合第一种情况(不是不存在,只是空的:P),一个或两个列表将是空列表([ ])。下划线 _ 将匹配任何东西,包括空列表。 - robertjlooby
所以如果我理解正确的话,当 (zip [] []) 发生时,它不会进入第一个情况,因为你不能解构空数组,因此你会到达第二个情况,由于 _ 接受任何列表,在这里返回一个空列表。这准确吗?并且确认一下,如果两种情况的顺序被交换,这个函数将是不正确的,因为它总是会落入第一个情况吗? - wmock

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