gpt4 book ai didi

haskell - (a == b) 的类型可以导出为多态吗?

转载 作者:行者123 更新时间:2023-12-02 17:09:47 27 4
gpt4 key购买 nike

由于 (==)::Eq a => a -> a -> Bool,我希望

a == b :: Eq a => Bool
-- assuming a :: forall a. a
-- derived type

但是(根据 GHCi :t)

a == b :: Bool

当然,这需要 TypeApplications,因此默认情况下不应启用它,但是是否有一个 LANGUAGE 选项可以启用此功能?

NoMonomorphismRestriction 不起作用。

编辑:既然您可能会说,“好吧,GHC(i) 已经知道任何实际示例中 ab 的类型”,不,例如,你可以有 (5 == 5)::(Num a, Eq a) => Bool
编辑:似乎a::forall a。 a 是不可能的,所以我们假设类似 x = 5::Num a => a

编辑:显式声明类型有效,所以问题实际上是“GHC能否推断出这种类型是多态的”,所以我正在寻找类似DeriveAmbigouslyTypes的东西.

最佳答案

这都是关于(==)的类型:

(==) :: forall a. Eq a => a -> a -> Bool

(==) 接受四个参数,按顺序:

  1. 一种类型,a,类型为Type(又名*),
  2. Eq a 类型的字典,
  3. a 类型的值。
  4. a 类型的值。

像往常一样,部分应用程序只能按顺序工作,并且字典参数不能显式传递。此外,类型参数只能在使用之前引入。所以当你写a == b时,这实际上意味着

(==) @_ @{dict} a b

推断类型参数和字典参数,并获得 Bool 类型的值。

您所追求的类型与(==)有相当不同的类型:

numLitEq
:: (forall a. (Num a, Eq a) => a)
-> (forall b. (Num b, Eq b) => b)
-> forall c. (Num c, Eq c) => Bool
numLitEq a b = (==) @c a b

但是,您不能完全这样写,因为无法将 c 类型变量纳入作用域。你能做的最好的就是

numLitEq
:: forall c.
(forall a. (Num a, Eq a) => a)
-> (forall b. (Num b, Eq b) => b)
-> (Num c, Eq c) => Bool
numLitEq a b = (==) @c a b

这并不比仅仅使用 (==) 更好。

关于haskell - (a == b) 的类型可以导出为多态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542595/

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