首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在haskell中组合floor和sqrt

在haskell中组合floor和sqrt
EN

Stack Overflow用户
提问于 2012-06-02 22:32:05
回答 1查看 5.1K关注 0票数 5

我只是在学习haskell (我自己,只是为了好玩),我遇到了一堵墙。

我的问题是:

如何定义函数

代码语言:javascript
复制
flrt = (floor . sqrt)

当我在一个文件中尝试并编译它时,GCHi报错如下:

代码语言:javascript
复制
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教程,但我都搞不懂。

附言:我也不明白单子是什么。(我搜索到的许多其他问题都涉及到这些)

附注:我的完整资料来源

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

发布于 2012-06-02 23:15:00

问题是您试图使用Integer作为输入。Haskell是强类型的,这意味着没有任何类型的隐式强制或转换。看看你想要组合的函数的签名:

代码语言:javascript
复制
sqrt  :: Floating a => a -> a
floor :: (RealFrac a, Integral b) => a -> b

并根据GHC推断的函数签名:

代码语言:javascript
复制
> :t floor . sqrt
floor . sqrt :: (RealFrac b, Integral c, Floating b) => b -> c

因此,要获得从Integer (没有Floating实例)到Integer的函数,您必须首先将参数转换为Floating,这可以通过使用fromIntegral来完成

代码语言:javascript
复制
> :t floor . sqrt . fromIntegral
floor . sqrt . fromIntegral :: (Integral a, Integral c) => a -> c
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10863132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档