haskell - 使用 `a0' 引起的模糊类型变量 `it'

标签 haskell functional-programming ghc ghci ambiguous-type-variable

我有以下函数来返回给定数字的因子对

factorPairs:: (RealFrac a, Floating a, Integral a) => a -> [(a, a)]
factorPairs n = map(\x -> (x, div n x)) [y | y <- [1..(ceiling $ sqrt n)], n `rem` y == 0]

当我在 ghci factorPairs 18 中调用函数时我收到一个运行时错误
   * Ambiguous type variable `a0' arising from a use of `it'
      prevents the constraint `(Floating a0)' from being solved.
      Probable fix: use a type annotation to specify what `a0' should be.
      These potential instances exist:
        instance Floating Double -- Defined in `GHC.Float'
        instance Floating Float -- Defined in `GHC.Float'
    * In the first argument of `print', namely `it'
      In a stmt of an interactive GHCi command: print it

我可以在 ghci 中对函数进行硬编码
map(\x -> (x, div 18 x)) [y | y <- [1..(ceiling $ sqrt 18)], 18 `rem` y == 0] 并且没有任何问题,但我似乎无法弄清楚为什么我的功能失败了。我相信 ghci 试图告诉我它无法确定调用什么类型 print但我正在努力寻找解决方案。

最佳答案

这与 Haskell 中数字文字重载的事实有关。当您键入 map(\x -> (x, div 18 x)) [y | y <- [1..(ceiling $ sqrt 18)], 18 `rem` y == 0]进入 ghci , 18这是 sqrt 的参数默认为 Double和其他人到Integer s。

然而,当你写

factorPairs:: (RealFrac a, Floating a, Integral a) => a -> [(a, a)]
factorPairs n = map(\x -> (x, div n x)) [y | y <- [1..(ceiling $ sqrt n)], n `rem` y == 0]

您强制 n 的所有实例只有一种类型。然后,问题就变成了根本没有满足所有这些约束的默认数字类型(实际上我认为通常是数字类型),因此 GHC 会告诉您它尝试的“可能实例”。解决方法是添加fromIntegral并放松约束:
factorPairs:: Integral a => a -> [(a, a)]
factorPairs n = map(\x -> (x, div n x)) [y | y <- [1..(ceiling $ sqrt $ fromIntegral n)], n `rem` y == 0]

关于haskell - 使用 `a0' 引起的模糊类型变量 `it',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531803/

相关文章:

Haskell 我如何知道 GHCi 是否正常工作

haskell - 如何为此 GADT 编写序列化实例?

java - 我们可以使用 java.util.function 获取方法名称吗?

haskell - 执行时出错 "cabal install hoogle"

windows - 如何使用 ghc 编译 GUI 可执行文件?

haskell - 如何理解 Haskell 编译器消息

haskell - 为什么 `succ i` 在 `i::Num a => a` 处有效(而不是 `Enum a` )?

postgresql - 如何根据 Haskell Groundhog 的数据库类型指定不同的列类型?

scala - scala 编译器对类型系统内的单元类型有什么特殊的规则

f# - 可变值和不可变值重定义有什么区别?