LINUX.ORG.RU

Предупреждение о отсутствии сигнатур типов

 ,


0

1

ghc при использовании -Wall выдает предупреждение об отсутсвии сигнатур типов для определений на верхнем уровне (Top-level binding with no type signature). У меня пока опыт с хаскеллом небольшой, но регулярно встречаются ситуации, когда надо определить на верхнем уровне какую-то тривиальную функцию, для которых указывать явно тип не вижу смысла - только затрудняет чтение кода лишней очевидной инфой.

Хотел бы спросить у опытных хаскеллистов - действительно ли полезно всегда указывать сигнатуру на верхем уровне, или лучше отключить этот ворнинг? Под полезно - я понимаю какую-то ощутимую полезность, а не удовлетворение эстетических прихотей какого-то академического старпера.

★★★★★

Сигнатура чаще всего красноречиво говорит о том, что эта функция делает. Иногда без них будут некорректно выводиться типы в других местах. Hoogle ищет по сигнатурам.

imtw
()
Ответ на: комментарий от true_admin

Доверяй, но проверяй :) Я б давал ворнинг только для экспортируемых функций модуля. Но авторы гхц наверняка умнее чем я, может я чего-то не понимаю?

provaton ★★★★★
() автор топика
Ответ на: комментарий от imtw

Сигнатура чаще всего красноречиво говорит о том, что эта функция делает.

Для сложных фунций - да. Но если определен какой-то тривиальный хелпер, типа incrementAll = map (+1)

Hoogle ищет по сигнатурам.

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

provaton ★★★★★
() автор топика

бонус например в том, что не будет лишнего полиморфизма.

если для реальной жизни делаешь - пиши, если так, поиграться, то дело твоё.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Стоит добавить, что время выполнения чаще всего сильно зависит от глубины полиморфности.

А то не ясно в чём бонус.

dmitry_malikov ★★
()
Ответ на: комментарий от provaton

incrementAll = map (+1)

Можно его в where поместить, там отсутствие сигнатур не вызовет предупреждений. Либо вообще не писать таких очевидных вещей (map (+1) понятнее ИМХО).

А так сигнатуры не помешают - документация, пусть и очевидная, ограничение полиморфизма и специализация, спецификация самого кода.

Например, если нужно не incrementAll :: Num a => [a] -> [a], а incrementAll :: [Int] -> [Int]. Или вот так:

sendAll ms a = mapM (a !) ms
-- опечатка, будет
sendAll :: [a] -> Actor a -> IO [a]
-- а нужно
sendAll :: [a] -> Actor a -> IO ()
-- которая вынудит написать mapM_
throwing = throw
-- + NoMonomorphismRestriction и будет
throwing :: Exception e => e -> a
-- а хочется
throwing :: SomeException -> IO a
quasimoto ★★★★
()
Ответ на: комментарий от true_admin

Ну, надо сказать, конкретно в случае GHC -Wall содержит и варнинги, которые любой несвихнувшийся на тотальной корректности человек будет игнорировать.

anonymous
()

а не удовлетворение эстетических прихотей какого-то академического старпера

Тогда бросай хаскель.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.