gpt4 book ai didi

haskell - 没有因使用 `area' 而产生的 (Fractional Int) 实例

转载 作者:行者123 更新时间:2023-12-01 22:29:44 29 4
gpt4 key购买 nike

我是 Haskell 的新手,我正在编写一个计算函数极限的程序。所以给出两个列表 ab , 三角洲 dx = 0.001 , 和积分的限制 lr ,我想用等式递归计算曲线下的面积: a1(x)^b1 + a2(x)^b2 + ... + an(x)bn其中 xl 之间的所有值一个r增量为 dx每个值之间。我猜技术部分不是那么重要,但它有助于阅读代码:

import Text.Printf (printf)

-- This function should return a list [area].
solve :: Int -> Int -> [Int] -> [Int] -> [Double]
solve l r x y = [area l r x y]

area l r a b = if (l < r)
then (calc l a b) * 0.001 + (area (l + 1) r a b)
else (calc r a b) * 0.001


calc n (a:arest) (b:brest) = (fromIntegral(n) ^^ b) * fromIntegral(a) + (calc n arest brest)
calc n [] [] = 0


--Input/Output.
main :: IO ()

main = getContents >>= mapM_ (printf "%.1f\n"). (\[a, b, [l, r]] -> solve l r a b). map (map read. words). lines

上面的代码没有错误,但是一旦我更改了 area (l + 1) r a barea (l + 0.001) r a b我收到以下错误消息:

No instance for (Fractional Int) arising from a use of `area'

我尝试创建一个新类并将其设为抽象类型,但这没有用,还有其他想法吗?

最佳答案

所以问题是Int不是 Fractional类型。换句话说,它没有名为 0.001 的值。 [note 1],但您已请求 Haskell 在您的代码中为您提供这样的值。

您提出此请求是因为 0.001被馈送到 (+)带有另一个参数(在本例中为 l )的函数,其类型为 Int .这是一个问题,因为该函数的类型为 (+) :: (Num a) => a -> a -> a : 换句话说,有很多不同的功能(+)所有类型都是 a -> a -> a ;每种类型都存在这些功能之一 aNum类型类。

因为我们知道函数的一个参数是 Int , 因此我们正在使用特定函数 (+) :: Int -> Int -> Int .这就是为什么 l + 0.001变得奇怪。

至于解决问题:你可能想要lr类型为 Double (它们是数字的左右边界?)但是如果您确定它们必须是 Int那么你可能打算写 fromIntegral l + 0.001 .

关于样式的旁注:Haskell 中的括号始终只是分组/优先级,函数的优先级高于运算符,运算符的优先级高于特殊形式( letcaseifdo ),以及函数应用总是左结合的或“贪婪的命名”:一个函数吃掉它前面的任何东西。你写了什么:

(fromIntegral(n) ^^ b) * fromIntegral(a) + (calc n arest brest)

最好写成:

fromIntegral a * fromIntegral n ^^ b + calc n arest brest

calc 两边的括号不是必需的(因为 + 等运算符的优先级低于函数应用程序),n 周围的括号也不是必需的和 a (因为这些子表达式是不可分割的 block ;fromIntegral(n) 等同于 fromIntegral (n) 等同于 fromIntegral n )。

  1. 正如@dfeuer 在下面提到的: secret 地,当你写 0.001 时它没有确定的类型;相反,它被翻译成 fromRational 0.001在内部,后者在哪里 0.001是定型的定值 Rational ,就像你写 4 一样它被翻译成fromInteger 4其中后 4 是定型的定值 Integer .问题真的是没有 fromRational Int 的功能,因为 Int不是 Fractional 的一部分定义 fromRational 的类型类.而且它不是该类型类的一部分,因为语言设计者更喜欢错误而不是无声的四舍五入/舍去小数。

关于haskell - 没有因使用 `area' 而产生的 (Fractional Int) 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30063040/

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