Haskell中算子中缀性质

pinkon5k  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(172)

我已经做了一个Haskell library,允许操作多元多项式。它使用了numeric-prelude库定义的一些示例,例如加法组示例。这个示例的加法在这个库中表示为+。我觉得这有点烦人,因为已经有常用的+表示数字了,所以我定义了:

import Algebra.Additive as AlgAdd

(^+^) :: Polynomial a -> Polynomial a -> Polynomial a
(^+^) p q = p AlgAdd.+ q

但是在我看来,这样做的话,+的“中缀属性”就丢失了。我从来没有处理过中缀属性,我有几个问题。我想保留相同的中缀属性。
1.查看代码时,我看到下面这行代码:

infixl 6  +, -

这一行是独立的,在代码的开头。

infixl 6 ^+^, ^-^

this blog post中,作者在定义一个函数之前定义了这个函数的中缀属性。这是另一种等价的方法吗?是否不可能像(^+^) = (AlgAdd.+)那样自动复制中缀属性?
1.仍然在看代码,我明白了:

{-# MINIMAL zero, (+), ((-) | negate) #-}

那是什么意思?
1.我也想知道如何定义多项式的反义词。我有减法p ^-^ q,但如何定义^-^ p
1.最后,当软件包作者定义示例(例如Double)时,他/她写道:

instance C Double  where
  {-# INLINE zero #-}
  {-# INLINE negate #-}
  {-# INLINE (+) #-}
  {-# INLINE (-) #-}
  zero   = P.fromInteger 0
  negate = P.negate
  (+)    = (P.+)
  (-)    = (P.-)

INLINE的用途是什么?

11dmarpk

11dmarpk1#

1.您可以在定义的上方编写中缀声明,但这不是必需的。

infixl 6 ^+^, ^-^

(^+^) :: Polynomial a -> Polynomial a -> Polynomial a
(^+^) = (AlgAdd.+)

无法复制中缀属性。

  1. Minimal pragma指的是要使类定义完整的“必须定义的最小方法集”。在您的情况下,这意味着您可以为方法“zero(+)(-)“或“zero(+)negate“编写定义,因为您可以根据第一组定义negate
negate a = zero - a

(-),用秒来表示,所以你定义哪一个并不重要。

n - m = n + negate m

1.不确定。

  1. Inline编译指示强制ghc内联(展开)定义。
vsdwdz23

vsdwdz232#

如果没有固定性声明,您的运算符^+^^-^的行为就像使用

infixl 9 ^+^, ^-^

如果您希望它们的行为或多或少类似于“常规”加法和减法,那么您应该显式声明它们的优先级为6,

infixl 6 ^+^, ^-^

结合性和优先级不能从另一个运算符“转移”;您只需查找希望与之类似的操作符的行为并适当地声明您的操作符。

相关问题