我总是以这种格式编写生成列表的递归函数:
recursiveFunc :: [a] -> [b]
recursiveFunc (x:xs) = [change x] ++ resursiveFunc xs where
change :: a -> b
change x = ...
Run Code Online (Sandbox Code Playgroud)
我意识到上面的任何功能都可以针对a -> b
案例编写,然后简单地编写map
一组[a]
,但请以这个淡化情况为例.
HLint建议更换[change x] ++ recursiveFunc xs
用change x : recursiveFunc xs
.
这个建议纯粹是美学的,还是对Haskell如何执行函数有一些影响?
使用[change x] ++ recursiveFunc xs
时创建一个多余的单元素列表,然后由该++
函数拆分.使用:
它不会发生.
Plus ++
是一个函数,然后将使用:
构造函数.:
直接使用时,无需调用函数.
因此:
,理论上使用更有效(编译器可能会优化这些差异).
线
recursiveFunc (x:xs) = [change x] ++ resursiveFunc xs
Run Code Online (Sandbox Code Playgroud)
有点混乱,因为它不是正常形式。这意味着++
可以直接用其定义的右侧替换:
(++) (a:as) bs = a:((++) as bs)
(++) [] bs = bs
-- =>
recursiveFunc (x:xs) = (change x):((++) [] resursiveFunc xs)
-- =>
recursiveFunc (x:xs) = (change x):(resursiveFunc xs)
Run Code Online (Sandbox Code Playgroud)
Haskell 编译器会自动应用这种转换。
但由于它是如此微不足道,它使您的代码更难阅读。一个人看着它问“等等……什么?”