【问题标题】:In Elm, why is this an Int-Float type mismatch?在 Elm 中,为什么这是 Int-Float 类型不匹配?
【发布时间】:2015-06-11 01:56:07
【问题描述】:

我是 elm 的新手,一般来说是函数式编程。在调用“显示”进行除法时,我遇到了令人费解的类型不匹配。此代码产生不匹配:

import Graphics.Element exposing (..)

columns = 2
main = placePiece 10

placePiece: Int -> Element
placePiece index =
  show (index/columns)

代码产生这个错误:

第 9 行第 3 到 22 列的以下类型之间的类型不匹配:

  Int

  Float

与以下表达式有关:

  show (index / columns)

我读到的意思是它期望和 Int,但得到了一个浮点数。但 show 适用于任何类型。如果我使用 floor 强制划分为 Int,我会得到同样的错误。但是,如果我对数字进行硬编码,例如show (10/2) 工作正常。

那么上面代码的哪一部分期望得到一个 Int?

【问题讨论】:

    标签: elm


    【解决方案1】:

    错误原因

    实际上,在这种情况下,编译器期望的是Float,但得到的是IntIntplacePiece 函数的参数index,它需要Float,因为Basics.(/) 需要Float 参数。

    为什么字面数字有效

    当您只对数字进行硬编码时,编译器会发现尽管您使用的是整数,但您可能希望将它们用作Float 而不是Int

    修复错误

    有三种方法可以修复此错误。如果你真的想接受一个 Int 但想要浮点除法,你必须将整数转换为浮点数:

    import Graphics.Element exposing (..)
    
    columns = 2
    main = placePiece 10
    
    placePiece: Int -> Element
    placePiece index =
      show (toFloat index / columns)
    

    如果您对采用浮点数的 placePiece 函数感到满意,您可以更改类型签名:

    import Graphics.Element exposing (..)
    
    columns = 2
    main = placePiece 10
    
    placePiece: Float -> Element
    placePiece index =
      show (index/columns)
    

    如果您想要整数除法,可以使用Basics.(//) 运算符:

    import Graphics.Element exposing (..)
    
    columns = 2
    main = placePiece 10
    
    placePiece: Int -> Element
    placePiece index =
      show (index//columns)
    

    【讨论】:

    • 在这种情况下,我想要整数除法,所以第三个选项是完美的。也感谢您解释文字为何起作用。我认为编译器只会将文字解释为浮点数,如果您输入类似x=1.0 的内容,并带有硬编码的小数位。
    猜你喜欢
    • 2021-11-28
    • 2017-12-05
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多