gpt4 book ai didi

haskell - 由于使用简单函数使用 ‘a0’ 而产生不明确的类型变量 ‘print’

转载 作者:行者123 更新时间:2023-12-02 02:54:59 24 4
gpt4 key购买 nike

我正在 Haskell 中实现一个函数:function

我已经写了

f x k = h x k

h x i = x^i/factorial i


factorial n = foldl (*) 1 [1..n]

其中 h 是一个辅助函数,在求和时将在 f 函数中使用。但现在当我尝试使用该函数时出现此错误:

<interactive>:109:1: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘print’
prevents the constraint ‘(Show a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show Integer -- Defined in ‘GHC.Show’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
...plus 22 others
...plus 19 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it

最佳答案

如果我们检查 h 的类型,我们会看到:

h :: (<b>Fractional a, Integral a</b>) => a -> a -> a

这意味着您的数字应该同时是小数整数。尽管严格来说,您可以在 Haskell 中创建属于两个类型类成员的数字,但这没有多大意义。 整数数字不是小数,反之亦然。

发生这种情况的原因是因为我们使用了 (/)::Fractional a => a -> a。因此,它要求分子和分母具有相同的类型,并且是Fractional 的成员。因此,这意味着阶乘 i 应该具有该类型 a,因此在范围内也应该具有 i 本身。但由于使用 (^) :: (Num a, Integral b) => a -> b -> ai 应该是整数。 .

您可以使用fromIntegral :: (Integral a, Num b) => a -> b将给定整数转换为 Num 成员的另一种类型:

h :: (Floating a, Integral b) => a -> a -> b
h x i = x^i / fromIntegral (factorial i)

这给了我们一个例子:

Prelude> h 2 1
2.0
Prelude> h 2 2
2.0
Prelude> h 2 3
1.3333333333333333

关于haskell - 由于使用简单函数使用 ‘a0’ 而产生不明确的类型变量 ‘print’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61305613/

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