2016-04-14 53 views
5

我正在查看示例http://elm-lang.org/examples/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在本文中所述。 https://dennisreimann.de/articles/elm-data-structures-record-tuple.html “使用_ one可以为将被忽略或跳过的值定义占位符。” –

回答

8

_用于匹配您不关心值的任何事物,因此通常用于匹配“其他”事件。

在您的示例代码中,(_, _)将匹配任意元组,其中包含2个值。请注意,它也可以替换为_,因为您最终不关心任何一个值。更说明性的例子是,你从数组关心一个值而不是其他的,例如我们不关心元组的第二个值的fstin the core package

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

实施,所以它只是与该位置的_匹配。

Elm中没有nullundefined,所以您不必担心存在“没有价值”(如果某件事没有价值,则使用Maybe类型)。

+0

感谢您的解释!在zip示例中,由于List a和List b可以具有不同的长度,(_,_)情况是否也处理a或b具有不同长度的情况?如果是这样,那么“_”值不会不存在吗? – wmock

+0

是的,如果一个或两个列表与第一个案例(不是不存在的,只是空的:P)不匹配,它们将是一个空列表('[]')。 '_'会匹配包括空列表在内的任何内容。 – robertjlooby

+0

所以如果我正确地理解了这一点,当发生'(zip [] [])'时,它不会落入第一种情况,因为你不能解构一个空数组,因此你到达第二种情况, '_'接受任何列表,它在这里返回一个空列表。这是否准确?并且要确认,如果切换了2个例子的ORDER,这个函数将会不正确,因为它总是会落入第一个情况? – wmock