【问题标题】:Equality of functions in Haskell, syntax problemsHaskell中的函数相等,语法问题
【发布时间】:2021-12-26 22:18:29
【问题描述】:

我一直在尝试为函数实现一个实例 Eq,但我不断收到语法错误,并且无法在任何地方找到它应该是的。如果对于每个输入,函数都抛出相同的输出,则该函数是相等的。所以我试着检查每个输入并检查结果是否相等。

newtype Funktion = Fkt { f :: Zahlraum_0_10 -> Zahlraum_0_10 }

data Zahlraum_0_10 = N | I | II | III | IV | V | VI
                     | VII | VIII | IX | X | F deriving (Eq,Ord,Show)

instance Eq Funktion where
  (==) (Fkt f2 _) (Fkt f1 _) = f2 I == f1 I && f2 II == f1 II && f2 III == f1 III &&
  f2 IV == f1 IV && f2 V == f1 V && f2 VI == f1 VI && f2 VII == f1 VII && f2 VIII == f1 VIII &&
  f2 IX == f1 IX && f2 X == f1 X && f2 N == f1 N && f2 F == f1 F

【问题讨论】:

  • 两个问题:在您的模式匹配中,Fkt 只有一个参数,但您匹配两个。 (去掉f2f1 之后的下划线)。第二:缩进。确保Eq 声明中的第 3 行和第 4 行向右缩进一点。但更重要的是,有更好的方法来写你想要的:让你的数据类型实例为EnumBounded,然后你就可以做到and [f1 x == f2 x | x <- [minBound .. maxBound]]
  • @alias 对,但是列表推导不返回布尔列表吗?我只想要一个布尔值,对吧?
  • 请注意对结果的调用andand [...],它结合了所有的布尔值。
  • @PramoxLol:列表推导确实返回了Bools 的列表,但and 函数会将其转换为单个BoolTrue 如果列表中的所有Bools 均为True,否则为False

标签: haskell syntax functional-programming


【解决方案1】:

错误是关于使用Fkt 数据构造函数:您的Fkt 数据构造函数只有一个 属性:函数fZahlraum_0_10 映射到@987654327 @。因此,您使用Fkt f1 将函数从Fkt 中解压缩出来,因此没有_ 作为第二个属性:

使用all :: Foldable f => (a -> Bool) -> f a -> Bool 可能会更好,因为这样可以减少比较两个函数的代码量(并减少出错的可能性):

instance Eq Funktion where
  Fkt f1 == Fkt f2 = all go [N, I, II, III, IV, V, VI, VII, VIII, IX, X, F]
    where go x = f1 x == f2 x

我们也可以使用liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c 而不是定义go 函数:

import Control.Applicative(liftA2)

instance Eq Funktion where
  Fkt f1 == Fkt f2 = all (liftA2 (==) f1 f2) [N, I, II, III, IV, V, VI, VII, VIII, IX, X, F]

我们不必明确定义值列表:由于所有数据构造函数都没有参数,因此可以轻松地将它们设为EnumBounded 的实例:

data Zahlraum_0_10 = N | I | II | III | IV | V | VI
                     | VII | VIII | IX | X | F deriving (Bounded, Enum, Eq, Ord, Show)

在这种情况下,我们可以确定这两个函数是否映射到每个参数的相同值:

import Control.Applicative(liftA2)

instance Eq Funktion where
  Fkt f1 == Fkt f2 = all (liftA2 (==) f1 f2) [minBound ..]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多