Haskellをラクガク

2006-09-18久々のHaskell

第6章 基本的な値 - 数値 00:43

ここからは難しくなりそうなので、細かいところを確かめつつやっていこうかと。まずは数値について。

IntとIntegerが違うってホント?

a = (16::Integer)
b = (3::Int)
c = a+b
main = print c
IntOrInteger.hs:3:6:
    Couldn't match `Integer' against `Int'
      Expected type: Integer
      Inferred type: Int
    In the second argument of `(+)', namely `b'
    In the definition of `c': c = a + b

あら、ホントだ。どうにかしてくれても良さそうなもんだけど、Haskellの型はかなり厳密なものらしい。

でも、

a = (16::Integer)
main = print (a+3)
19

これはOK。つまり、数値リテラル文脈によって変換されるけど、一旦型を決めてしまうとIntとIntegerですら互換性がないみたい。

リテラルだけど型を付けてやると、

a = (16::Integer)
main = print (a+(3::Int))
IntOrInteger.hs:2:17:
    Couldn't match `Integer' against `Int'
      Expected type: Integer
      Inferred type: Int
    In the expression: 3 :: Int
    In the second argument of `(+)', namely `(3 :: Int)'

怒られる。

AntioneAntione2007/07/02 05:07http://64fdebd2c057be50b9c19d9a1e08d879-t.xxpogy.org <a href="http://64fdebd2c057be50b9c19d9a1e08d879-h.xxpogy.org">64fdebd2c057be50b9c19d9a1e08d879</a> [url]http://64fdebd2c057be50b9c19d9a1e08d879-b1.xxpogy.org[/url] [url=http://64fdebd2c057be50b9c19d9a1e08d879-b2.xxpogy.org]64fdebd2c057be50b9c19d9a1e08d879[/url] [u]http://64fdebd2c057be50b9c19d9a1e08d879-b3.xxpogy.org[/u] 9dc75301cfe28cfb0fb3d1863c1dee5e