print xs
тип (Foldable t, Show a) => t a -> IO () выводится, а при
g = mapM_ print
нет? При этом декларация для g работает в ghci.
Функции не из практики, а взяты ради примера (можно было бы взять traverse pure или ещё что-либо).
Ясно, что порядочный человек сам напишет аннотацию и не встретится с проблемой.
Однако я не очень понимаю, чем отличается процесс выведения типов для f и для g и как аргумент может помочь в этом.
в общем, в хаскеле по мотивам увеличения производительности по дефолту включено расширение MonomorphismRestriction, которое хочет "специализировать" твою поин-фри функцию без сигнатуры и параллельно ломает вывод типов в некоторых кейсах. Добавление аргумента просто даёт лишний намёк компилятору, что ты от него хочешь. В то же время в ghci это расширение не работает и там до талого не дефолтят типы.
Спасибо, теперь ясно. Из-за того, что всегда писал сигнатуры, как-то даже забыл, что это расширение вообще существует, да ещё и идёт по умолчанию. А вот посмотрел бы :showi language, может, и спрашивать бы не пришлось.
Обсуждают сегодня