read
определяется во Вводной части как
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
?