【问题标题】:Haskell $ operator in practical useHaskell $操作符在实际使用中
【发布时间】:2018-10-02 05:44:12
【问题描述】:

我正在尝试使用 $ 运算符了解 Haskell 表达式。特别是关于如何在 Haskell 中使用 $ 运算符或其他如果需要的话:

add 1 (add (subtract 2 4) (subtract 8 16))

我设法删除了两个paren组,如下所示:

add 1 $ add (subtract 2 4) $ subtract 8 16

但仍然需要删除最后一对。

有什么想法吗?

【问题讨论】:

  • addsubtract 是什么?它们是如何定义的?
  • 不确定这是否重要,但对于这种情况,add = (+)subtract = flip (-)
  • 请注意,$. 不一定要在所有情况下都删除括号。最重要的用途是将应用程序f1 (f2 (f3 (f4 x))) 转换为“管道”f1 $ f2 $ f3 $ f4 $ x(f1 . f2 . f3 . f4) x 的形式,使其更具可读性。这不适用于需要多个参数的函数。
  • 这很清楚,谢谢。我想确保这是不可能的,或者如果可能的话。

标签: haskell operators operator-precedence


【解决方案1】:

你可以试试中缀形式

add 1 $ subtract 2 4 `add` subtract 8 16

编辑

还有其他方法。

让我们定义:

newtype W a = W { w :: a } 

pure' = W

(.$.) :: W (a -> b) -> a -> W b
(.$.) (W a) b = W $ a b

以及要使用的操作

plus :: Int -> Int -> Int
plus = (+)

那我们可以做下一步了

foo :: Int
foo = w $ pure' plus .$. plus 1 2  .$.  2 

它基本上是应用函子(你可以用谷歌搜索示例),只是名称不同。

你在你的操作前加上w $ pure',用.$.分隔参数。

【讨论】:

  • 使用addsubtract 的原因是为了让它与前缀一起工作。最终,我并没有试图解决任何问题,只是想找出使用​​$ oparetor 的方法。
  • 您可以使用前缀+,例如(+) 1 2
  • 是的,我知道,但它仍然不适用于问题中的表达式。
  • 是的。没有括号就无法工作。
  • 您应该如何将pure'/(.$.) 对应用于原始问题?
猜你喜欢
  • 2019-08-28
  • 2016-03-30
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多