HLint:使用 &&& 建议建议。

7

我在一个小项目中使用了HLint工具,并且它建议我使用&&&。

例如:

>>> cat st.hs
f = (+) 10
g = (+) 1

main = print $ (\x -> (f x, g x)) 5
>>> hlint st.hs
st.hs:4:17: Warning: Use &&&
Found:
  \ x -> (f x, g x)
Why not:
  f Control.Arrow.&&& g

1 suggestion

我理解\x -> (f x, g x)是一种模式,并感谢您的建议。但是,Control.Arrow.&&&不能接受普通函数,而是需要箭头函数,所以我无法像建议的那样使用&&&
那么在这种情况下,推荐的方法是什么?
  • 定义自己的&&&函数?
  • 使用箭头函数并执行类似于(arr f) &&& (arr g)的操作,但我甚至不知道如何评估它?
  • 在特定场合忽略Hlint提示?

3
你可以在函数中使用 &&&,例如 ((+10) &&& (+1)) 10,它的结果是 (20,11)。使用 &&& 可以同时对给定的参数应用两个不同的函数,并将其结果作为一对元组返回。 - Chris Taylor
2
永远记住,Haskell 中的函数类型并没有什么特别之处。(->) 是一个二元类型构造器,与 Array 等没有任何区别。函数可以像其他任何类型一样使用,成为实例,存储为容器中的数据... 只有一件额外的事情,你可以用它们来对值进行应用,这是其他数据类型无法做到的。 - leftaroundabout
1
实际上,我认为数组组合器与任何其他箭头类型相比更常与函数一起使用... - leftaroundabout
1个回答

15

Arrow是一个类型类,其中(->)是一个实例(请参见这里的“Instances”,以及这里的实现)。这意味着您可以直接使用箭头运算符,例如(&&&)与函数一起使用。


我之前不知道(->)这个符号的存在。非常感谢。 - mb14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接