繁体   English   中英

Haskell 中运算符的中缀属性

[英]infix properties of operators in Haskell

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

import Algebra.Additive as AlgAdd

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

但在我看来,这样做会丢失+的“中缀属性”。 我从来没有处理过中缀属性,我有几个问题。 我想保留相同的中缀属性。

  1. 查看代码,我看到了这一行:

     infixl 6 +, -

此行是孤立的,位于代码的开头。 那么我是否应该同样包含该行

infixl 6 ^+^, ^-^

在我的代码的开头? 这篇博文中,作者在定义 function 之前定义了 function 的中缀属性。 这是另一种等效的继续方式吗? 是否不可能以自动复制中缀属性的方式执行(^+^) = (AlgAdd.+)之类的操作?

  1. 仍在查看代码,我看到:

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

这意味着什么?

  1. 我也想知道如何定义多项式的反面。 我有减法p ^-^ q但如何定义^-^ p

  2. 最后,当 package 作者为Double定义实例时,他/她写道:

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

INLINE的目的是什么?

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

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

    不能复制中缀属性。

  2. Minimal pragma指的是“必须定义的最小方法集”,以使 class 定义成为总定义。 在您的情况下,这意味着您可以为方法“ zero and (+) and (-) ”或“ zero and (+) and negate ”编写定义,因为您可以根据第一组定义negate

     negate a = zero - a

    (-)就第二个而言。 所以你定义哪一个并不重要。

     n - m = n + negate m
  3. 没有把握。

  4. Inline pragma强制 ghc 内联(展开)定义。 这是对是否有理由不将一元绑定运算符(>>=)标记为内联的答案?

如果没有固定性声明,您的运营商^+^^-^将表现得就像声明了

infixl 9 ^+^, ^-^

也就是说,具有极高优先级的左关联。 如果您希望它们的行为或多或少像“常规”加法和减法,那么您应该明确声明它们具有优先级 6

infixl 6 ^+^, ^-^

关联性和优先级不能从另一个运算符“转移”; 您只需要查找您想要与之相似的操作员的行为并适当地声明您的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM