2012-09-18 2 views
4

Вот короткий транскрипт из GHCi:Что происходит, когда я сочиняю «шоу» и «читаю» в Haskell?

Prelude> :t read 
read :: Read a => String -> a 
Prelude> :t show 
show :: Show a => a -> String 
Prelude> :t show.read 
show.read :: String -> String 
Prelude> (show.read) "whales" 
"*** Exception: Prelude.read: no parse 

Когда я сочиняю show и read я могу только предположить, что GHC выбрал некоторый произвольный тип, который является одновременно Read состоянии и Show состоянии быть «промежуточного» типа.

Как он выбрал этот тип, и есть ли способ узнать, что это такое?

ответ

13

Правила дефолта GHCi говорят, что выбранный тип - (). который является типом по умолчанию, который выбирается, если требуется экземпляр Show. GHCi выберет () для общих ограничений, Integer для числовых или интегральных ограничений и Double для дробных/других реальных ограничений. Это связано не с тем, что какой-то Haskell является внутренним; это именно то, как GHCi был реализован так, чтобы его можно было легко использовать в качестве калькулятора.

Если вы действительно ввели код в файл и скомпилировали его, будут применяться более строгие правила GHC, и вы получили бы ошибку, заявив, что промежуточный тип не может быть разрешен.

Вы, конечно, можете проинструктировать GHC использовать другой тип, давая одну из функций типа, например:

show . (read :: String -> Int) 
+5

Вы можете убедиться сами, что он выбирает '()' довольно легко, тоже: ' ghci> (show. read) "()" ' –

+0

Как насчет' read: String -> String'? Строка, переданная для чтения, должна быть указана внутри: 'show. (read: String -> String) $ "\" hello \ "" ' –

Смежные вопросы