我正在编写一个函数,它从列表中获取元素并返回它们.
我觉得很简单.但是当使用"take"时,例如:take 2 [1.2,3,4]
它返回:[1.2,3.0]当我真正想要的时候[1.2, 3]
我想创建一个遍历列表并减少不必要的小数的函数,但我无法理解它看到haskell不接受我与x&round(x)的比较
function :: [a] -> [a]
function(x:xs)
if x == round(x) = round(x):function xs
else x:function xs
Run Code Online (Sandbox Code Playgroud)
那么答:有没有更简单的解决方案?B:为什么不能将x与圆(x)进行比较?
Dan*_*ner 11
你说,"我实际上想要[1.2, 3][而不是[1.2, 3.0]]".我解释这意味着你想要一个包含Floats或类似数字的列表,对于没有分数部分的数字的Ints或类似数字.
你不能拥有这个.
Haskell中的所有列表都是同类的:每个元素都具有相同的类型.
你可以做一些事情; 例如,你可以有标记的联合,这是典型的例子Either.所以
[Left 1.2, Right 3] :: [Either Double Integer]
Run Code Online (Sandbox Code Playgroud)
会好的; 但是你需要明确标记每个元素.
这或多或少都是为什么x == round x不起作用的答案:(==)运算符采用相同类型的两个参数; 而通常round不能返回与其参数相同类型的值.你可能会喜欢properFraction:
> properFraction 3
(3,0.0)
> properFraction 1.2
(1,0.19999999999999996)
Run Code Online (Sandbox Code Playgroud)
你可以检查这个的第二部分,以确定你的号码是否是一个整数(当它是,第一部分将是结果round).
take不会更改列表元素的类型.启动GHCi并继续.我的提示是>>>.
>>> :t [1.2,3,4]
[1.2,3,4] :: Fractional t => [t]
Run Code Online (Sandbox Code Playgroud)
这表示列表元素有一些Fractional类型.
>>> :t [1.2,3.0,4.0]
[1.2,3.0,4.0] :: Fractional t => [t]
Run Code Online (Sandbox Code Playgroud)
GHCi也在这里说同样的话.到底是怎么回事?
>>> :t 2
2 :: Num t => t
>>> :t 2.0
2.0 :: Fractional t => t
Run Code Online (Sandbox Code Playgroud)
没有小数的数字文字被推断为具有某种Num类型.带有小数的数字文字被推断为具有某种Fractional类型.要使两个元素位于同一列表中,它们必须具有相同的类型.什么是常见的类型2和2.0?
>>> :t 2 `asTypeOf` 2.0
2 `asTypeOf` 2.0 :: Fractional a => a
Run Code Online (Sandbox Code Playgroud)
所有Fractional类型都是Num类型,因此常见的类型是2和2.0某种Fractional类型.
>>> [1.2,3,4]
[1.2,3.0,4.0]
Run Code Online (Sandbox Code Playgroud)
我们可以从列表的打印中看到,所有元素都被推断为一种Fractional类型.默认为Double.
要从列表中删除不必要的小数,您必须更具体地说明您希望此列表具有哪种类型.名单Int没有小数和列表Double总是有小数.单个列表不能同时包含两个元素Int和Double类型元素.
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |