Я изучаю Haskell с тех пор, так что я новичок.Haskell полиморфные вызовы без знания полного типа
Следующий код очень легко и понятно:
purStrLn $ show [1]
Здесь мы можем вывести все типы (по умолчанию с), и все работает хорошо. Но следующий код работает, тоже:
putStrLn $ show []
даже если мы не можем определить тип списка.
Если я выполнить код с GHCI я получаю следующее:
Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude>
поэтому тип, кажется, полиморфный. Но в этом случае шоу будет вызываться с частично применяемым типом.
Такое же поведение характерно для других типов, например Data.Map.empty, поэтому оно не является функцией списка (или, по крайней мере, кажется).
Почему и как это работает?
'purStrLn $ показать [1]' по-прежнему имеет значение по умолчанию для типа, а '[1] :: (Num n) => [n]' – amindfv
Это правда, но в таких случаях есть значения по умолчанию. – Totoro
Обратите внимание, что что-то еще происходит, когда переменная типа не ограничена, например, например. 'length []', см .: http://stackoverflow.com/q/7076517. – hammar