Haskell 中数据类型的混淆
Confusion about data types in Haskell
我必须写一个简单的 pi 近似值,我做到了并且工作正常,但在任务中它说要用 header "pi_approx :: Int -> Double 编写一个函数".
我的代码:
pi_approx x = sqrt (pi2_approx(x))
pi2_approx x =
if x/= 1
then (6 /(x*x)) + (pi2_approx(x-1))
else (6/(1*1))
然而我的函数在没有“pi_approx :: Int -> Double”的情况下工作正常,但是当我尝试使用这个声明时我总是得到类型错误:
pi_approx.hs:10:14: 错误:
- 无法匹配预期类型
Double' with actual type
Int'
- 在表达式中:(+) (6 / (x * x)) (pi2_approx (x - 1))
在表达式中:
如果 x /= 1 那么
(+) (6 / (x * x)) (pi2_approx (x - 1))
别的
(6 / (1 * 1))
在 `pi2_approx' 的等式中:
pi2_approx x
= 如果 x /= 1 那么
(+) (6 / (x * x)) (pi2_approx (x - 1))
别的
(6 / (1 * 1))
|
10 |然后 (+) (6 /(x*x)) (pi2_approx(x-1))
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我尝试以各种方式使用 fromIntegral,如果我 运行 没有声明的函数,我检查了解决方案的类型,即:“(Floating a, Eq a) => a”
据我所知,Double 应该是 Floating 的一个实例,所以我不明白为什么它无法编译。
我是 haskell 的新手,我似乎不了解数据类型和约束的核心概念。不过,我似乎找不到关于该主题的任何简单而好的 documentation/explanation。也许这里有人可以根据这个例子帮助我理解:)
因为 x
是一个 Int
,因此 x * x
也是一个 Int
,并且您不能将 Int
用于 (/) :: Floating a => a -> a -> a
].
您需要将其转换为 Double
,例如 fromIntegral :: (Integral a, Num b) => a -> b
:
pi2_approx :: Int -> Double
pi2_approx 1 = 6
pi2_approx x = 6 / <strong>fromIntegral</strong> (x*x) + pi2_approx (x-1)
对于大量的迭代,它给出的结果接近π2:
Prelude> sqrt (pi2_approx 10000)
3.1414971639472147
我必须写一个简单的 pi 近似值,我做到了并且工作正常,但在任务中它说要用 header "pi_approx :: Int -> Double 编写一个函数".
我的代码:
pi_approx x = sqrt (pi2_approx(x))
pi2_approx x =
if x/= 1
then (6 /(x*x)) + (pi2_approx(x-1))
else (6/(1*1))
然而我的函数在没有“pi_approx :: Int -> Double”的情况下工作正常,但是当我尝试使用这个声明时我总是得到类型错误:
pi_approx.hs:10:14: 错误:
- 无法匹配预期类型
Double' with actual type
Int' - 在表达式中:(+) (6 / (x * x)) (pi2_approx (x - 1)) 在表达式中: 如果 x /= 1 那么 (+) (6 / (x * x)) (pi2_approx (x - 1)) 别的 (6 / (1 * 1)) 在 `pi2_approx' 的等式中: pi2_approx x = 如果 x /= 1 那么 (+) (6 / (x * x)) (pi2_approx (x - 1)) 别的 (6 / (1 * 1)) | 10 |然后 (+) (6 /(x*x)) (pi2_approx(x-1)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我尝试以各种方式使用 fromIntegral,如果我 运行 没有声明的函数,我检查了解决方案的类型,即:“(Floating a, Eq a) => a”
据我所知,Double 应该是 Floating 的一个实例,所以我不明白为什么它无法编译。
我是 haskell 的新手,我似乎不了解数据类型和约束的核心概念。不过,我似乎找不到关于该主题的任何简单而好的 documentation/explanation。也许这里有人可以根据这个例子帮助我理解:)
因为 x
是一个 Int
,因此 x * x
也是一个 Int
,并且您不能将 Int
用于 (/) :: Floating a => a -> a -> a
].
您需要将其转换为 Double
,例如 fromIntegral :: (Integral a, Num b) => a -> b
:
pi2_approx :: Int -> Double
pi2_approx 1 = 6
pi2_approx x = 6 / <strong>fromIntegral</strong> (x*x) + pi2_approx (x-1)
对于大量的迭代,它给出的结果接近π2:
Prelude> sqrt (pi2_approx 10000)
3.1414971639472147