我已将类型定义为:
type Register = Int
我还可以使用以下函数从字符串列表中读取数字列表:
readInt :: String -> Int
readInt s = read s :: Int
现在,在readInt
这样的列表上使用readInt "12 32 11"
会向我[12, 32, 11]
提供[Int]
类型。
我的问题是:我不是[Int]
,而是[Register]
。
我试过了:
readRegister :: String -> Register
readRegister s = read s :: Register
但正如我猜测的那样,它似乎不是有效的语法。
答案 0 :(得分:3)
您对Register
的定义是一种类型别名,即它可以与其右侧互换,即此处为Int
。
但是你声明readInt "12 32 11"
会产生[12,32,11] :: [Int]
。鉴于readInt :: String -> Int
的类型签名,这是不可能的。也许您可以向我们展示一些代码。
答案 1 :(得分:2)
Register
只是类型Int
的另一个名称,它是相同的类型。语法
readRegister :: String -> Register
readRegister s = read s :: Register
有效(但read
结果上的类型注释是不必要的)。如果它不起作用,您的编译器/解释器就会崩溃。但是,类型是显示为Int
还是Register
可能会令人惊讶。预测何时扩展类型同义词并不容易预测。