我已经做了一个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
的用途是什么?
2条答案
按热度按时间11dmarpk1#
1.您可以在定义的上方编写中缀声明,但这不是必需的。
无法复制中缀属性。
Minimal
pragma指的是要使类定义完整的“必须定义的最小方法集”。在您的情况下,这意味着您可以为方法“zero
和(+)
和(-)
“或“zero
和(+)
和negate
“编写定义,因为您可以根据第一组定义negate
和
(-)
,用秒来表示,所以你定义哪一个并不重要。1.不确定。
Inline
编译指示强制ghc内联(展开)定义。vsdwdz232#
如果没有固定性声明,您的运算符
^+^
和^-^
的行为就像使用如果您希望它们的行为或多或少类似于“常规”加法和减法,那么您应该显式声明它们的优先级为6,
结合性和优先级不能从另一个运算符“转移”;您只需查找希望与之类似的操作符的行为并适当地声明您的操作符。