haskell 学你一个haskell 第4章的例子让人迷惑

haskell Learn you a haskell chapter 4 example confusing

所以我开始学习 haskell 并在第 4 章找到了不理解的示例 作者写了一个函数来提取名字和姓氏的首字母

initials :: String -> String -> String  
initials firstname lastname = [f] ++ ". " ++ [l] ++ "."  
    where (f:_) = firstname  
          (l:_) = lastname  


这里是什么意思..她将 f 列表与句点以及 l 和句点列表结合在一起..她如何使用辅助函数?她取 (f:_) = firstname 是因为 f 是 firstname 的第一个字母吗?两个词都用head函数是不是更简单?

更容易理解的写法是

initials firstname lastname = case (firstname, lastname) of
    (f:_, l:_) -> [f] ++ ". " ++ [l] ++ "."  

原代码中没有helper函数,只有helper variables f, l :: Char.

实际上最好的写法是不引入 firstnamelastname,而是简单地对它们进行模式匹配:

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

另请注意,我们仍然需要处理任一列表为空的情况。

initials fn [] = ...?
initials [] ln = ...?

是的,使用head函数更简单:

initials :: String -> String -> String  
initials firstname lastname = [head firstname] ++ ". " ++ [head lastname] ++ "."  

但是 [head x] == take 1 x 当它工作时,而 head 空输入错误而 take 1 没有,在这种情况下只返回一个空列表。所以这里最好使用take 1

initials :: String -> String -> String  
initials firstname lastname = take 1 firstname ++ ". " ++ take 1 lastname ++ "."