gpt4 book ai didi

haskell - 自定义 Ord 实例卡在列表上

转载 作者:行者123 更新时间:2023-12-01 07:15:14 26 4
gpt4 key购买 nike

import Data.Function (on)
import Data.List (sort)

data Monomial = Monomial
{ m_coeff :: Coefficient
, m_powers :: [(Variable, Power)]
}
deriving ()

instance Ord Monomial where
(>=) = on (>=) m_powers

instance Eq Monomial where
(==) = on (==) m_powers

这是我的代码的摘录,缩减到主要大小。让我们尝试比较:
*Main> (Monomial 1 [("x",2)]) > (Monomial (-1) [])
/* Computation hangs here */
*Main> (Monomial 1 [("x",2)]) < (Monomial (-1) [])
/* Computation hangs here */

附带说明一下,如果我替换 s/(>=)/(>)/g 会很有趣。在实例声明中,它不会卡在第一对上,但仍会卡在第二对上:
*Main> (Monomial 1 [("x",2)]) > (Monomial (-1) [])
True
*Main> (Monomial 1 [("x",2)]) < (Monomial (-1) [])
/* Computation hangs here */

尽管标准规定了 Eq instance 的最小声明要么是 $compare$$(>=)$ .

这里可能有什么问题? (>=) 在列表上似乎工作得很好。

最佳答案

简答:
您需要提供 (<=)compareOrd 有一个完整的定义,不是 (>=) .

更长的解释:
Haskell 中的类型类通常会根据其他方法实现某些方法的默认实现。然后,您可以选择要实现的那些。例如,Eq看起来像这样:

class Eq a where
(==), (/=) :: a -> a -> Bool

x /= y = not (x == y)
x == y = not (x /= y)

在这里,您必须执行 (==)(/=) ,否则尝试使用其中任何一个都会导致无限循环。您需要提供哪些方法通常在文档中列为最小完整定义。
Ord 的最小完整定义实例, as listed in the documentation , 要么是 (<=)compare .由于您只提供了 (>=) ,您还没有提供完整的定义,因此某些方法会循环。您可以通过例如修复它更改您的实例以提供 compare反而。
instance Ord Monomial where
compare = compare `on` m_powers

关于haskell - 自定义 Ord 实例卡在列表上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com