在where子句中模式是否匹配不仅匹配模式expr的LHS部分,而且匹配expr的RHS部分。

时间:2015-10-19 16:53:02

标签: haskell pattern-matching

我在教程(http://learnyouahaskell.com/syntax-in-functions

中看到了这些代码
initials :: String -> String -> String  
initials firstname lastname = [f] ++ ". " ++ [l] ++ "."  
    where (f:_) = firstname  
          (l:_) = lastname    

但我在这里感到困惑。

 where (f:_) = firstname  
       (l:_) = lastname   

其中2个模式完全相同,它们之间的唯一区别是方程的RHS,一个是名字,另一个是姓。

where子句中的模式匹配不仅匹配模式expr的LHS部分,而且匹配expr的RHS部分。

1 个答案:

答案 0 :(得分:2)

模式:

where (f:_) = firstname

相当于f = head firstname。特别是,如果firstname是空列表,它将抛出异常。

所以where子句中的两个模式相当于:

where f = head firstname
      l = head lastname

该功能也可以这样写:

initials (f:_) (l:_) = [f] ++ ". " ++ [l] ++ "."

这可能会更清楚initials将失败,除非名字和姓氏都不为空。