Как определить тип литерала в Haskell? - PullRequest
0 голосов
/ 12 октября 2018

Когда я проверяю тип литерала в GHCi, я нахожу

Prelude> :t 1
1 :: Num p => p

Prelude> :t 'c'    
'c' :: Char

Prelude> :t "string"    
"string" :: [Char]

Prelude> :t 1.0
1.0 :: Fractional p => p

Проблема в том, как Haskell определяет тип такого литерала?Где я могу найти информацию об этом?

Кроме того, существует ли какой-либо способ изменить способ GHC интерпретировать тип литерала?

Например:

 -- do something

 :t 1
 1 :: Int      -- interprets 1 as Int rather then Num p => p

 :t 1.0
 1.0 :: Double -- interprets 1.0 as Double rather then Fractional p => p 

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы пишете 1, он имеет любой возможный тип номера .Вот что на самом деле означает Num p => p.

Если вы используете 1 в выражении, GHCi попытается определить правильный тип числа для использования, основываясь на том, какие функции вы вызываете, и затемавтоматически присваивает 1 правильный тип.

Если GHCi не может угадать, какой правильный тип (из-за недостаточного контекста или из-за того, что подходит несколько типов), он по умолчанию принимает Integer,(И для 1.0 по умолчанию он будет Double. А для любого другого ограничения типа он попытается по умолчанию установить (), если это возможно.)

Это похоже на работу скомпилированного кода.Если вы напишите число в исходном коде, GHC (компилятор) попытается автоматически определить, каким должен быть правильный тип.Разница в том, что если компилятор не может понять это, он не будет"догадываться" или "по умолчанию", он просто выдаст вам ошибку времени компиляции итребовать, чтобы вы указали, что вы имеете в виду.Желательно, чтобы скомпилированный код работал так, как вы ожидали, но он утомителен для интерактивного тестирования, поэтому GHCi имеет значения по умолчанию.

Тип одиночного символа всегда Char.

Тип строки: всегда String или [Char].(Один является псевдонимом другого.)

Тип True и False равен всегда Bool.И так далее.

Так что только на самом деле числа могут иметь несколько типов.

[Ну, есть возможность сделать строки полиморфными, но сейчас мы не будем об этом беспокоиться....]

Если вам нужны подробности, вы можете прочитать Отчет о языке Haskell (который является официальным документом спецификации, определяющим язык Haskell) и руководство пользователя GHCi (которое описывает, что делает GHCi).

0 голосов
/ 12 октября 2018

Вы можете попросить ghci по умолчанию для переменных типа:

$ ghci
λ> let x = 3
λ> :type x
x :: Num p => p
λ> :type +d x
x :: Integer
λ> :type +d 1
1 :: Integer
λ> :type +d 1.0
1.0 :: Double

:type +d заставит ghci выбрать типы по умолчанию для переменных типа.Кроме того, это общее правило по умолчанию для Haskell:

default Num Integer
default Real Integer
default Enum Integer
default Integral Integer
default Fractional Double
default RealFrac Double
default Floating Double
default RealFloat Double

Подробнее об этом можно узнать здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...