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
.
实际上最好的写法是不引入 firstname
和 lastname
,而是简单地对它们进行模式匹配:
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 ++ "."
所以我开始学习 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
.
实际上最好的写法是不引入 firstname
和 lastname
,而是简单地对它们进行模式匹配:
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 ++ "."