gpt4 book ai didi

haskell - 如何获得一对(元组)整数和 float ?

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

我是 Haskell 的初学者,我正在尝试创建一个包含 2 个元素的元组,第一个是整数,第二个是 float 。示例:

f1 n = [(x, x) | x <- [1 .. n]]
f2 n = [(x, 1 / x) | x <- [1 .. n]]

> f1 5
[(1,1),(2,2),(3,3),(4,4),(5,5)]

> f2 5
[(1.0,1.0),(2.0,0.5),(3.0,0.3333333333333333),(4.0,0.25),(5.0,0.2)]

f1 的行为符合预期,返回两个整数的元组列表。

f2 返回两个 float 的元组列表,但我希望它返回一个整数和一个 float 的元组列表。

如何将第一个元组元素类型保留为整数,以便 f2 5 的输出如下所示:[(1,1.0),(2,0.5),( 3,0.3333333333333333),(4,0.25),(5,0.2)]

最佳答案

发生这种情况的原因是编译器看到 1/x,它不仅要求结果是 float 的(实际上是 Fractional ),而且还要求参数 x >。这是因为 Haskell 中的数字运算符具有完全相同的类型签名

(/) :: Fractional a => a -> a -> a

即编译器推断 x 也必须已经具有浮点类型,因此元组的左侧元素最终成为 float 。

您可以通过不除以 x 本身而是允许转换来防止这种情况:

Prelude> [(x, 1 / fromIntegral x) | x <- [1 .. 9]]
[(1,1.0),(2,0.5),(3,0.3333333333333333),(4,0.25),(5,0.2),(6,0.16666666666666666),(7,0.14285714285714285),(8,0.125),(9,0.1111111111111111)]

此外,当类型看起来不正确时,您应该始终尝试的一件事是添加显式签名。通过这种方式,您还可以强制以其他可能更合适的类型执行计算,例如 Rational:

Prelude> [(x, 1 / fromIntegral x) | x <- [1 .. 9]] :: [(Int, Rational)]
[(1,1 % 1),(2,1 % 2),(3,1 % 3),(4,1 % 4),(5,1 % 5),(6,1 % 6),(7,1 % 7),(8,1 % 8),(9,1 % 9)]

此外,如果您尝试一些不起作用的操作,您将得到一个明确的编译器错误,而不是默默地得到意想不到的结果。

关于haskell - 如何获得一对(元组)整数和 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69893012/

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