我在教程(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部分。
答案 0 :(得分:2)
模式:
where (f:_) = firstname
相当于f = head firstname
。特别是,如果firstname
是空列表,它将抛出异常。
所以where子句中的两个模式相当于:
where f = head firstname
l = head lastname
该功能也可以这样写:
initials (f:_) (l:_) = [f] ++ ". " ++ [l] ++ "."
这可能会更清楚initials
将失败,除非名字和姓氏都不为空。