Haskell 创建单例列表的两个函数之间的差异

Haskell 创建单例列表的两个函数之间的差异,haskell,hlint,Haskell,Hlint,在我的程序上运行hlint时,它报告了一个错误 \x -> [x] 并提出了替代形式 (: []) hlint认为第一个表单有什么错误,因此为什么要使用(可读性较差的)第二个选项 编辑 (在问题中明确添加了hlint) 我的问题不在于从词汇的角度看,两者的区别是什么(我确实都理解)。我的问题是,我不理解为什么hlint将其标记为错误。例如,懒惰有什么不同吗?此外,为什么之前hlint认为是错误的,而\x->Just x只提出了一个警告。没有真正的区别。HLint关注风格问题;最终,它们

在我的程序上运行hlint时,它报告了一个错误

\x -> [x]
并提出了替代形式

(: [])
hlint认为第一个表单有什么错误,因此为什么要使用(可读性较差的)第二个选项

编辑 (在问题中明确添加了hlint)


我的问题不在于从词汇的角度看,两者的区别是什么(我确实都理解)。我的问题是,我不理解为什么hlint将其标记为错误。例如,懒惰有什么不同吗?此外,为什么之前hlint认为是错误的,而
\x->Just x
只提出了一个警告。

没有真正的区别。HLint关注风格问题;最终,它们只是如何使代码看起来更好的提示

通常,将lambda与构造函数或类似的函数一起使用是多余的,并且会使代码更难阅读。作为一个极端的例子,以像
Just
这样的构造函数为例:将
Just
\x->Just x
进行比较。这些都是等效的,但第二个版本肯定会让事情更加混乱!更近的例子是,大多数人会选择
(+1)
而不是
\x->x+1


在您的特殊情况下,情况就不同了,因为列表有特殊的语法。因此,如果您更喜欢
\x->[x]
版本,请保留它。但是,一旦你习惯了运算符部分,你可能会发现<>代码>(/[])/COD>版本是容易的(如果不是更容易的),那么现在就考虑使用它。

< P>我可以考虑使用<代码>返回< /代码>或<代码>纯< /> >:

ghci> return 0 :: [Int]
[0]

ghci> import Control.Applicative
ghci> pure 0 :: [Int]
[0]

我需要包括类型注释(
:[Int]
),因为我在GHCi工作。在一堆其他代码中,你可能不需要它。

一个常见的问题,我刚刚在其中添加了一个答案。它说:

每个提示都有一个严重级别:

  • 错误-例如
    concat(map f x)
    建议将
    concatMap f x
    作为“错误”严重性提示。从样式的角度来看,您应该始终将
    concat
    map
    的组合替换为
    concatMap
    。请注意,这两个表达式是等效的-HLint报告的是样式错误,而不是代码中的实际错误
  • 警告-例如
    x!!0
    建议
    头部x
    作为“警告”严重性提示。通常,
    head
    是表示列表第一个元素的一种更简单的方法,特别是当您以归纳的方式对待列表时。但是,在表达式
    f(x!!4)(x!!0)(x!!7)
    中,将中间参数替换为head会使遵循模式变得更加困难,这可能是一个坏主意。警告提示通常是值得的,但不应盲目应用
错误和警告的区别在于个人品味,通常是我个人的品味。如果你已经对哈斯克尔风格有了很好的了解,那么你应该忽略其中的差异。如果您是Haskell程序员的初学者,您可能希望在警告提示之前先关注错误提示


虽然区别在于个人品味,但有时我会改变主意。查看此线程中的两个示例,
(:[])
似乎是一个相对“复杂”的提示-您正在将
[x]
的语法糖分解为
x:[]
,如果您从未对其进行模式匹配,它在某些方面正在剥离列表作为通用容器的抽象。相比之下,
\x->Just x
Just
似乎总是一个好主意。因此,在HLint-1.8.43(刚刚发布)中,第一个是警告,第二个是错误。

(:[])
(“机器人”)对初学者来说很奇怪;我第一次看到它时,它肯定把我绊倒了。但现在这只是我词汇表中的另一个习惯用法——很像将变量名复数化(例如
xs
)或使用节翻转函数(例如
(`Map.member`m)
)谢谢你的回答。虽然对我来说还有一个问题(这可能是最有趣的部分),但为什么hlin不认为这是一个错误而不是警告?我对问题进行了编辑以使其更加清晰,并添加了在您的示例上运行hlint的结果。hlint认为错误和警告只是尼尔·米切尔的判断。不要深入探讨它。@augustss,好吧,当这是一个标准时,我确实不应该太重视错误和警告之间的区别。尽管有时我很想这样做,但我认为这比其他任何一种解决方案都不清楚发生了什么。我仍然记得我制定
return:[x]的那天
\x->[x]
。我希望黑线鳕有一个很好的方法来记录这些有用的事实。。。