haskell 学习 haskell 第 4 章令人困惑的示例

rad*_*yer 1 haskell built-in

所以我从 Learn you a haskell 开始,在第 4 章找到了一个不理解的示例作者编写了一个函数来从名字和姓氏中提取缩写

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


Run Code Online (Sandbox Code Playgroud)

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

lef*_*out 5

写同样的事情的更容易理解的方式是

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

原始代码中没有辅助函数,只有辅助变量 f, l :: Char。

实际上,编写此代码的首选方法是甚至不引入firstname和lastname,而是简单地对它们进行模式匹配:

initials (f:_) (l:_) = [f] ++ ". " ++ [l] ++ "."  
Run Code Online (Sandbox Code Playgroud)

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

initials fn [] = ...?
initials [] ln = ...?
Run Code Online (Sandbox Code Playgroud)