gpt4 book ai didi

haskell - 为什么 "take"在 haskell 中改变数据类型?

转载 作者:行者123 更新时间:2023-12-02 05:28:03 25 4
gpt4 key购买 nike

我正在编写一个从列表中获取元素并返回它们的函数。

我觉得很简单。但是当例如使用“take”时:take 2 [1.2,3,4]

它返回:[1.2,3.0] 当我真正想要 [1.2, 3]

我想创建一个遍历列表并删除不必要的小数位的函数,但是看到 haskell 不接受我与 x & round(x) in 的比较,我无法理解它

function :: [a] -> [a]
function(x:xs)
if x == round(x) = round(x):function xs
else x:function xs

So A:有没有更简单的解决方案?B:为什么 haskell 不能比较 x 和 round(x)?

最佳答案

你说,“我实际上想要 [1.2, 3] [而不是 [1.2, 3.0]]”。我将其解释为您想要一个列表,其中包含用于小数的 Float 等和用于没有小数部分的数字的 Int 等。

你不能拥有这个。

Haskell 中的所有列表都是同类的:每个元素都具有相同的类型。

有些事情你可以做;例如,您可以标记联合,典型示例是 Either。所以

[Left 1.2, Right 3] :: [Either Double Integer]

会很好;但您需要明确标记每个元素。

这也或多或少地解释了为什么 x == round x 不起作用:(==) 运算符接受两个相同类型的参数;而通常 round 不能返回与其参数类型相同的值。您可能会喜欢 properFraction:

> properFraction 3
(3,0.0)
> properFraction 1.2
(1,0.19999999999999996)

您可以检查第二部分以确定您的数字是否为整数(如果是,第一部分将是 round 的结果)。

关于haskell - 为什么 "take"在 haskell 中改变数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46064670/

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