gpt4 book ai didi

haskell - 无法匹配具有约束的多态元组

转载 作者:行者123 更新时间:2023-12-02 12:16:05 25 4
gpt4 key购买 nike

我对 Haskell 比较陌生,所以如果这真的很明显,请原谅我。

基本上我有两个 Bool ,基于它们我想选择 3 个不同函数的实现。如果两个 bool 值相等(例如均为 True 或均为 False),则函数不应执行任何操作。如果其中一个 Bool 为 True,则有不同的实现。

这些函数涉及约束,因此例如第一个函数对参数有 Ord 或 Bounded 约束。第二个函数对参数有 Num 约束。

我遇到的问题是我不知道如何使类型检查器能够使用此构造。请参阅下面的一个最小示例,当我对结果进行模式匹配时,该示例会提示:

f :: (Ord a, Bounded a) => a -> a -> a
f a b = if a > b then maxBound else minBound

g :: (Ord a, Bounded a) => a -> a -> a
g a b = if a > b then minBound else maxBound

a = True
b = False

test
| a == b = (const, const, const)
| a = (f, (-), (+))
| b = (g, (+), (-))

(resF, _, _) = test

(_, resG, _) = test -- error Could not deduce (Ord b0) arising from a use of ‘test’
-- from the context: Num b
-- Same error occurs for the last value in the tuple.

我不确定具有最多约束的函数 resF 如何完全可以被分配给变量,但 resG 提示......

感谢任何帮助!

最佳答案

TL;DR版本:因为GHC会默认Num b2Num b3但不是(Ord b1, Bounded b1) .

这是 type defaulting 的问题。 test的类型推断为 (Ord b1, Bounded b1, Num b2, Num b3) => (b1 -> b1 -> b1, b2 -> b2 -> b2, b3 -> b3 -> b3) 。此类型意味着如果您提供 OrdBounded某种类型的实例 b1 ,以及 Num某些类型的实例 b2b3 ,你会得到一个函数元组。当您将元组拆开并只保留一个时,其他约束不会消失,因此您基本上有 resF :: (Ord b1, Bounded b1, Num b2, Num b3) => b1 -> b1 -> b1resG :: (Ord b1, Bounded b1, Num b2, Num b3) => b2 -> b2 -> b2 .

现在,在 resF , b2b3是不明确的类型,因为它们用在 => 的左侧但不是在右边。根据类型默认规则,这些将默认为 Integer ,所以你最终得到 resF确实有一种类型 (Ord b1, Bounded b1) => b1 -> b1 -> b1并且一切正常。

resG是不同的。其中,b1b3是模棱两可的类型。 b3默认为Integer就像 resF 所做的那样。但是,GHC 没有默认值 b1将满足约束 (Ord b1, Bounded b1) ,所以它会给你一个错误(这肯定会更清楚)。

要解决此问题,您需要告诉 GHC 什么类型 b1将会。由于您保留的元组部分不使用 b1 ,你可以选择任何你想要的,这并不重要。这是执行此操作的一种方法(在本示例中,我选择 Int ):

(_, resG, _) = test :: (Num b2, Num b3) => (Int -> Int -> Int, b2 -> b2 -> b2, b3 -> b3 -> b3)

关于haskell - 无法匹配具有约束的多态元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57137421/

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