Haskell:读取和输入签名

时间:2010-07-29 12:09:50

标签: haskell type-inference

read在Prelude中定义为

read :: (Read a) => String -> a

并且可以用作例如read "1" :: Int

现在是一个功能

readOne :: (Read a) => [String] -> (a, [String])
readOne (x:xs) = (read x,xs)

在错误

中使用readOne ["1","foo"]结果(如预期的那样)

Ambiguous type variable 'a' in the constraint:
'Read a' arising from a use of 'readOne' at :1:0-18
Probable fix: add a type signature that fixes these type variable(s)

readOne ["1","foo"] :: Int不起作用,而

readOneInt :: [String] -> (Int, [String])
readOneInt = readOne

工作正常:

> readOneInt ["1", "foo"]
(1,["foo"])

那么:如何在不定义像readOne这样的新功能的情况下向readOneInt添加类型签名?

1 个答案:

答案 0 :(得分:9)

readOne ["1","foo"] :: Int不起作用,因为readOne无法返回Int,它总是返回一个元组,其第二个元素是[String]readOne ["1", "foo"] :: (Int, [String])可以使用。

请注意,如果无法推断,您只需指定类型。如果您在需要readOne的上下文中使用Int的结果,则可以使用readOne而不使用类型注释。例如:

let inc (i, strs) = (i + 1, strs) in
inc (readOne ["1", "foo"])
-- (2, ["foo"])