在Elm中,为什么这是Int-Float类型的不匹配?

时间:2015-06-11 01:56:08

标签: elm

我是elm的新手,也是一般的函数式编程。在通过调用'show'进行分组时,我遇到了令人费解的类型不匹配。此代码产生不匹配:

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,但得到了Float。但show适用于任何类型。如果我使用floor来强制划分为Int,我会得到同样的错误。但是,如果我对数字进行硬编码,例如show (10/2)它运作正常。

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

1 个答案:

答案 0 :(得分:8)

错误原因

实际上在这种情况下,编译器期望Float但获得IntIntindex函数的参数placePiece,它期望Float,因为Basics.(/)期望Float个参数。

为什么文字数字起作用

当您只是对数字进行硬编码时,编译器可以确定虽然您使用整数,但您可能希望将它们用作Float而不是Int

修复错误

有三种方法可以解决此错误。如果你真的想接受一个I​​nt但想要浮点除法,你必须将整数转换成一个浮点数:

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)