Haskell将Float转换为Int

时间:2009-09-09 01:58:46

标签: haskell floating-point int

我还是新手并尝试创建一个在函数中使用的列表,并希望尽可能小地保留它,这恰好是logBase x y。 但是我无法将logBase变成我可以在此列表中使用的东西。

[1 ..(logBase x y)]

有什么建议吗?

3 个答案:

答案 0 :(得分:10)

你没有发布你得到的类型错误,但我想它是这样的:

Prelude> let x = 2
Prelude> let y = 7
Prelude> [1 .. (logBase x y)] 

<interactive>:1:7:
    No instance for (Floating Integer)
      arising from a use of `logBase' at <interactive>:1:7-17
    Possible fix: add an instance declaration for (Floating Integer)
    In the expression: (logBase x y)
    In the expression: [1 .. (logBase x y)]
    In the definition of `it': it = [1 .. (logBase x y)]

问题在于:

Prelude> :t logBase
logBase :: (Floating a) => a -> a -> a

返回Floating类中的一个类型,而程序中的其他变量(1,'x','y')是整数类型。

我认为你想要一个整数序列?

Prelude> :set -XNoMonomorphismRestriction
Prelude> let x = 2
Prelude> let y = 42
Prelude> [1 .. truncate (logBase x y)] 
[1,2,3,4,5]

使用truncate,celing或floor。

答案 1 :(得分:8)

您可能需要其中一个函数列表hereHoogleHayoo!是这类工具的绝佳工具,因为它们可以让您输入所需功能的类型并返回功能列表。使用Haskell的丰富类型系统,这可能是一个非常有用的工具,远远超过动态类型语言甚至是静态类型语言,如C或Java。

答案 2 :(得分:2)

您可能需要某种舍入,截断,地板或天花板功能。 Ints和Floats是不同的类型(正如你所见),编译器不会让你混合它们。我会在一分钟内找到参考资料。