Haskell List Concatenation vs.(head:tail)格式

Xan*_*unn 6 haskell list

我总是以这种格式编写生成列表的递归函数:

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 xschange x : recursiveFunc xs.

这个建议纯粹是美学的,还是对Haskell如何执行函数有一些影响?

sep*_*p2k 9

使用[change x] ++ recursiveFunc xs时创建一个多余的单元素列表,然后由该++函数拆分.使用:它不会发生.

Plus ++是一个函数,然后将使用:构造函数.:直接使用时,无需调用函数.

因此:,理论上使用更有效(编译器可能会优化这些差异).


max*_*zig 5

线

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 编译器会自动应用这种转换。

但由于它是如此微不足道,它使您的代码更难阅读。一个人看着它问“等等……什么?”