Haskell筛选不同类型(Int和Float)的列表时出现问题

Haskell筛选不同类型(Int和Float)的列表时出现问题,haskell,Haskell,有人能帮我解释一下为什么这个代码不起作用吗?我是哈斯克尔的新手,我不知道 int2Float :: Int -> Float int2Float x = fromIntegral x :: Float isbigCircle :: Float -> Int -> Bool isbigCircle y x = (int2Float x)^2*pi > y bigCircles :: Float -> [Int] -> [Float] bigCircles y

有人能帮我解释一下为什么这个代码不起作用吗?我是哈斯克尔的新手,我不知道

int2Float :: Int -> Float
int2Float x = fromIntegral x :: Float

isbigCircle :: Float -> Int -> Bool
isbigCircle y x = (int2Float x)^2*pi > y

bigCircles :: Float -> [Int] -> [Float]
bigCircles y list = filter (isbigCircle y) list

如注释中所述,过滤
Int
s列表将产生
Int
s列表。更好的方法是

isBigCircle::Float->Float->Bool
isBigCircle y x=x^2*pi>y
bigCirclesFloat::Float->[Float]->[Float]
bigCirclesFloat y=过滤器$isBigCircle y
bigCirclesInt::Float->[Int]->[Float]
bigCirclesInt float=bigCirclesFloat y。fmap积分

如果过滤
Int
s列表,您将返回
Int
s列表,而不是
Float
s列表。如果您真的需要浮点列表,您可以再次使用
from integral
(或者您的
int2Float
,这只是一个受限版本)。PS在Haskell中很少使用
Float
而不是
Double
,我不确定是否有任何优势
Double
更准确,虽然它确实占用了更多空间,但我确信我在某个地方读到过,因为它是最常见的,它实际上经过了优化,性能优于
Float
@罗宾兹格蒙德同意浮动汇率是不寻常的,但肯定不是没有优势的。它可以小于双精度浮点,并且当符合某些要求单精度浮点的规范,或者与需要浮点的FFI库进行互操作时,它是必需的。@RobinZigmond非常感谢您!我忘了换那个。。。所有的逻辑都是好的,至少。。。我用这两种方法进行了测试,这样我就可以让它工作了,这是一项任务(还有一些我没有问题的东西),所以我不会改变列表类型。顺便说一句,如果你想发送一个正确的答案,我会接受。@RobinZigmond在Haskell中,
Float
没有意义的主要原因是它在实践中占用了同样多的空间。
Float
Double
实际上都是指向64位对齐内存位置的64位指针。然而,当将它们存储在非固定向量中时,这并不适用,在这种情况下,
Float
确实很有意义。而且,是的,
Float
在现代处理器上实际上可以更快,因为您可以更多地使用SIMD矢量化,尽管GHC仍然没有做到这一点。