Haskell: считайте и введите подписи

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?

6
задан Greg S 29 July 2010 в 12:09
поделиться