Очень плохо знаком с Haskell и пытаюсь понять, как взаимодействуют классы типов и переменные.
Первое, с чем я поиграл, было:
i :: a; i = 1
Я ожидал, что, поскольку я был напечатан как можно более обобщенно, я мог присвоить ему абсолютно все, что угодно. (Я знаю, что, вероятно, ничего не могу сделать с переменной i, но это не важно.)
Но я был неправ. Вышеприведенное дает ошибку и требует, чтобы она была:
i :: Num a => a; i = 1
Поигравшись еще немного, я пришел к следующему:
g :: Num a => a -> a; g a = a + 1
g 1
(returned 2)
gg :: Num a => a; gg = g 1
gg
(returned 2)
Хорошо... пока все хорошо. Давайте попробуем дробный параметр.
g :: Num a => a -> a; g a = a + 1
g 1.3
(returned 2.3)
gg :: Num a => a; gg = g 1.3
(error)
Итак, пожалуйста... что такого в переменных, что вызывает это? С точки зрения нефункционального программирования это «выглядит», как будто у меня есть функция, которая возвращает значение с типом, реализующим Num, и пытается присвоить его переменной с типом, реализующим Num. Тем не менее, задание не выполняется.
Я уверен, что это какое-то основное заблуждение, которое у меня есть. Вероятно, это то же самое, что мешает работе первого примера. Я действительно хочу исправить это, прежде чем я начну делать гораздо более серьезные концептуальные ошибки.
g 1.3
, это означает, что тип более ограничен,gg
имеет типgg :: Fractional a => a
. Обратите внимание, однако, что (за исключением некоторых редких случаев) вы не должны вводить переменные, Haskell всегда будет использовать наиболее общий возможный тип. Вы не назначаете значения переменной, вы объявляете переменную: однажды присвоив значение, вы больше никогда не сможете изменить его значение. - person Willem Van Onsem   schedule 01.05.2019Fractional
, он должен быть членом класса типовNum
, следовательно, это означает, чтоFractional
более специфичен, чем классу типовNum
, так как другие члены (например,Int
) могут быть членами класса типовNum
, но не класса типовFractional
. - person Willem Van Onsem   schedule 01.05.2019int i; i = 2
, это не так. - person Willem Van Onsem   schedule 01.05.2019=
не присвоение. это определение. - person Will Ness   schedule 01.05.2019Num
иFractional
, как связанный вопрос.) См. Также Когда два вопроса считаются дубликатами? обсуждение мета-SO. - person Daniel Wagner   schedule 02.05.2019