gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:25:17 26 4
gpt4 key购买 nike

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

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/

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