История изменений
Исправление korvin_, (текущая версия) :
потому что Read — это типокласс, экземпляра которому компилятор не смог найти, поскольку Read подразумевает чистое значение, а контейнер-конвеер IO в Read не умеет.
Read не «подразумевает чистое значение», его можно научить читать в IO:
instance (Read a) => Read (IO a) where
readsPrec d s =
let xs = readsPrec d s in
let m (x, s) = (return x, s) in
map m xs
main = do
read "123" :: IO Int
print "World"
а проблема в твоём примере, что
- всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
- read имеет тип
String -> a
и еслиa
не может быть выведен из контекста, его нужно указывать явно. А для этого не нужно никакое глубокое понимание системы типов именно Хаскелла.
Исправление korvin_, :
потому что Read — это типокласс, экземпляра которому компилятор не смог найти, поскольку Read подразумевает чистое значение, а контейнер-конвеер IO в Read не умеет.
Read не «подразумевает чистое значение», его можно научить читать в IO:
instance (Read a) => Read (IO a) where
readsPrec d s =
let f = readsPrec d in
let xs = f s in
map (\(x, s) -> (return x, s)) xs
main = do
read "123" :: IO Int
print "World"
а проблема в твоём примере, что
- всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
- read имеет тип
String -> a
и еслиa
не может быть выведен из контекста, его нужно указывать явно. А для этого не нужно никакое глубокое понимание системы типов именно Хаскелла.
Исправление korvin_, :
потому что Read — это типокласс, экземпляра которому компилятор не смог найти, поскольку Read подразумевает чистое значение, а контейнер-конвеер IO в Read не умеет.
Read не «подразумевает чистое значение», его можно научить читать в IO:
instance (Read a) => Read (IO a) where
readsPrec d s =
let f = readsPrec d in
let xs = f s in
map (\(x, s) -> (return x, s)) xs
main = do
read "123" :: IO Int
print "World"
а проблема в твоём примере, что
- всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
- read имеет тип
String -> a
и еслиa
не может быть выведен из контекста, его нужно указывать явно. А для этого не нужно никакое глубокое понимание системы типов именно Хаскелла.
Исходная версия korvin_, :
потому что Read — это типокласс, экземпляра которому компилятор не смог найти, поскольку Read подразумевает чистое значение, а контейнер-конвеер IO в Read не умеет.
Read не «подразумевает чистое значение», его можно научить читать в IO:
instance (Read a) => Read (IO a) where
readsPrec d s =
let f = readsPrec d in
let xs = f s in
map (\(x, s) -> (return x, s)) xs
main = do
read "123" :: IO Int
print "World"
а проблема в твоём примере, что
- всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
- read имеет тип
String -> a
и еслиa
не может быть выведен из контекста, его нужно указывать явно. А для этого не нужно никакое глубокое понимание системы типов именно Хаскелла.