我只是在学习haskell (我自己,只是为了好玩),我遇到了一堵墙。
我的问题是:
如何定义函数
flrt = (floor . sqrt)当我在一个文件中尝试并编译它时,GCHi报错如下:
AKS.hs:11:9:
No instance for (RealFrac Integer)
arising from a use of `floor'
Possible fix: add an instance declaration for (RealFrac Integer)
In the first argument of `(.)', namely `floor'
In the expression: (floor . sqrt)
In an equation for `flrt': flrt = (floor . sqrt)
AKS.hs:11:17:
No instance for (Floating Integer)
arising from a use of `sqrt'
Possible fix: add an instance declaration for (Floating Integer)
In the second argument of `(.)', namely `sqrt'
In the expression: (floor . sqrt)
In an equation for `flrt': flrt = (floor . sqrt)我不明白为什么结果函数不是Int -> Int。
我刚刚完成了CS课程的第二年,完成了一门基本的PL课程。我听说过,但还不太了解类型。我试着通读了一些haskell教程,但我都搞不懂。
附言:我也不明白单子是什么。(我搜索到的许多其他问题都涉及到这些)
附注:我的完整资料来源
bar = \a b -> if (2^a) > b
then (a-1)
else bar (a+1) b
foo = bar 1
flrt :: Integer -> Integer
flrt = (floor . sqrt)
aks target = if (target < 2)
then putStr "Not a Prime.\n\n"
else if elem (mod target 10) [0,2,4,5,6,8]
then putStr "Composite\n\n"
else if (elem target) [a^b | a <- [3,5..(flrt target)], b <- [1.. (foo target)]]
then putStr "Composite\n\n"--}
else
putStr "filler"发布于 2012-06-02 23:15:00
问题是您试图使用Integer作为输入。Haskell是强类型的,这意味着没有任何类型的隐式强制或转换。看看你想要组合的函数的签名:
sqrt :: Floating a => a -> a
floor :: (RealFrac a, Integral b) => a -> b并根据GHC推断的函数签名:
> :t floor . sqrt
floor . sqrt :: (RealFrac b, Integral c, Floating b) => b -> c因此,要获得从Integer (没有Floating实例)到Integer的函数,您必须首先将参数转换为Floating,这可以通过使用fromIntegral来完成
> :t floor . sqrt . fromIntegral
floor . sqrt . fromIntegral :: (Integral a, Integral c) => a -> chttps://stackoverflow.com/questions/10863132
复制相似问题