作为练习,我写了一个简短的Haskell函数,它返回一个字符串的前四个字符,连接起来.我很难将字符转换为字符串并使用丑陋的replicate黑客.改善此功能的最佳方法是什么?(我猜测模式和输出都可以改进.)
concatFirstFour :: [Char] -> [Char]
concatFirstFour (a:b:c:d:_) = (replicate 1 a) ++ (replicate 1 b) ++ (replicate 1 c) ++ (replicate 1 d)
concatFirstFour xs = error "Need at least four characters."
Run Code Online (Sandbox Code Playgroud)
更新:非常感谢大家.我从所有的答案和评论中学到了很多东西.我更了解类型.
这是我最终使用的代码:
initFirstFour :: [a] -> [a]
initFirstFour str
| length str > 3 = take 4 str
| otherwise = error "Need at least four characters."
Run Code Online (Sandbox Code Playgroud)
更新2:将第二个模式从xs更改为_每个ptival的注释.懒惰的eval FTW.
更新3:来自tew88评论的清洁卫兵.
Pti*_*val 11
concatFirstFour (a:b:c:d:_) = [a,b,c,d]
concatFirstFour _ = error "Need at least four characters."
Run Code Online (Sandbox Code Playgroud)
要么
concatFirstFour = take 4
Run Code Online (Sandbox Code Playgroud)
但最后一个在短名单上没有失败......
另请注意,您不需要指定类型是[Char](或String),因为您从不在代码中使用此假设.让它成为[a] - > [a].