我应该如何重构这个Haskell代码以使其更优雅?

Mic*_*ael 6 string haskell

作为练习,我写了一个简短的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].