2012-02-15 82 views
1

我已经定义了一个类型为类型:哈斯克尔转换数字的字符串转换成

type Register = Int

我也能够使用像一个函数的字符串列表数字列表如下:

readInt :: String -> Int 
readInt s = read s :: Int 

现在,像readInt "12 32 11"名单上使用readInt给我[12, 32, 11]这是[Int]类型。

我的问题是:而不是[Int],我怎么能得到[Register]

我想:

readRegister :: String -> Register 
readRegister s = read s :: Register 

但我猜到了,它似乎并没有有效的语法。

+1

适用于我,这不会产生任何错误:http://hpaste.org/63762 - 您应该在代码中包含代码中的错误,以及与此相关的任何其他代码。 – 2012-02-15 21:26:31

+1

类型别名Haskell非常脆弱;他们几乎可以互换。 – Owen 2012-02-15 21:27:53

回答

3

您对Register的定义是一个类型别名,即它可以与其右侧互换,即此处带有Int

但是您声明readInt "12 32 11"会产生[12,32,11] :: [Int]。鉴于您的类型签名readInt :: String -> Int,这是不可能的。也许你可以向我们展示更多的代码。

+0

对不起,我应该增加更多细节。所述的readInt函数用作 '映射的readInt(字S)' 现在我readRegister代码是 readRegister ::字符串 - >注册 readRegister S =阅读S ::注册 readRegisters的s ::字符串 - > [注册] readRegisters s = map readRegister(words s) – rdasxy 2012-02-15 22:23:16

2

Register只是Int类型的另一个名称,它是同一类型。语法

readRegister :: String -> Register 
readRegister s = read s :: Register 

有效(但read结果的类型注释是不必要的)。如果它不起作用,你的编译器/解释器就坏掉了。然而,类型是否显示为IntRegister可能会令人惊讶。预测类型同义词何时扩展以及何时不扩展并不容易。