LINUX.ORG.RU

История изменений

Исправление 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"

а проблема в твоём примере, что

  1. всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
  2. 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"

а проблема в твоём примере, что

  1. всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
  2. 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"

а проблема в твоём примере, что

  1. всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
  2. 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"

а проблема в твоём примере, что

  1. всё выражение (read «123») должно в данном контексте возвращать какой-то IO-тип.
  2. read имеет тип String -> a и если a не может быть выведен из контекста, его нужно указывать явно. А для этого не нужно никакое глубокое понимание системы типов именно Хаскелла.