首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在“楼层”中键入默认值。平方`

在“楼层”中键入默认值。平方`
EN

Stack Overflow用户
提问于 2018-09-27 12:40:01
回答 2查看 262关注 0票数 3

使用-Wtype-defaults (随-Wall提供),即使当我指定参数的类型和结果时,floor . sqrt . fromIntegral也会给出大量的警告:

代码语言:javascript
运行
复制
λ> (floor . sqrt . fromIntegral) (10 :: Int) :: Int

<interactive>:356:2-6: warning: [-Wtype-defaults]
    • Defaulting the following constraints to type ‘Double’
        (RealFrac a0)
          arising from a use of ‘floor’ at <interactive>:356:2-6
        (Floating a0)
          arising from a use of ‘sqrt’ at <interactive>:356:10-13
        (Num a0)
          arising from a use of ‘fromIntegral’ at <interactive>:356:17-28
    • In the first argument of ‘(.)’, namely ‘floor’
      In the expression: floor . sqrt . fromIntegral
      In the expression: (floor . sqrt . fromIntegral) (10 :: Int) :: Int

<interactive>:356:2-6: warning: [-Wtype-defaults]
    • Defaulting the following constraints to type ‘Double’
        (RealFrac a0)
          arising from a use of ‘floor’ at <interactive>:356:2-6
        (Floating a0)
          arising from a use of ‘sqrt’ at <interactive>:356:10-13
        (Num a0)
          arising from a use of ‘fromIntegral’ at <interactive>:356:17-28
    • In the first argument of ‘(.)’, namely ‘floor’
      In the expression: floor . sqrt . fromIntegral
      In the expression: (floor . sqrt . fromIntegral) (10 :: Int) :: Int
3

我能够通过为fromIntegral指定一种非多态类型来解决这个问题。

代码语言:javascript
运行
复制
λ> (floor . sqrt . (fromIntegral :: Int -> Double)) (10 :: Int) :: Int
3

以下内容也有效,但更麻烦:

代码语言:javascript
运行
复制
λ> (floor . sqrt . (fromIntegral :: (Integral a) => a -> Double)) (10 :: Int) :: Int
3

我的问题是:

  • 是否有更简单的方法来避免类型默认警告?(关闭-Wtype-defaults不符合条件。)
  • 这是计算Haskell中这个复合函数(平方根层)值的正确方法吗?必须使用fromIntegral并指定中间类型,这让我想起了一句谚语:“简单的事情是困难的。”
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 13:19:38

有三种类型可供选择(输入类型、内部使用的中间浮点类型和结果类型),您必须以某种方式告诉编译器这三种类型。有很多组合来修复它们,但你不能短于三。

我认为TypeApplications是一种特别方便的方法来指定这些类型。这里有一种方法可以从原来的注释(其中有两个注释)开始,然后只添加一个来避免默认情况:

代码语言:javascript
运行
复制
> :set -XTypeApplications -Wtype-defaults
> (floor . sqrt @Double . fromIntegral) (10 :: Int) :: Int
3

这里还有一个可能更符合人体工程学的方法(因为它对于括号的确切位置更灵活):

代码语言:javascript
运行
复制
> (floor . sqrt . fromIntegral @Int @Double) 10 :: Int
3

我喜欢第三个示例的想法,即修改第二个示例,使您不必重复Int,从而避免潜在的脆弱点。通过使用特殊的_类型应用程序,您可以以稍微简单一些的方式实现这一点,它允许编译器对其中一个类型变量使用通常的推理过程:

代码语言:javascript
运行
复制
> (floor . sqrt . fromIntegral @_ @Double) (10 :: Int) :: Int
3
票数 5
EN

Stack Overflow用户

发布于 2018-09-27 13:26:58

这是计算Haskell中这个复合函数(平方根层)值的正确方法吗?必须使用fromIntegral并指定中间类型,这让我想起了一句谚语:“简单的事情是困难的。”

您最终是在计算整数平方根,因此理想情况下,您希望避免通过sqrt :: Floating a => a -> a路由计算。你可能会。例如,使用算术库中的integerSquareRoot :: Integral a => a -> a

至于您的第一个问题,我第二个Daniel Wagner's suggestion使用TypeApplications扩展来指定中间类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52537287

复制
相关文章

相似问题

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