Я понимаю, что это потенциально можно рассматривать как субъективный или, возможно, вопрос вне темы, поэтому я надеюсь, что вместо его закрытия он будет перенесен, возможно, в программистов.
Я начинаю изучать Haskell, в основном для собственного назидания, и мне нравится много идей и принципов, поддерживающих язык. Я стал очарован функциональными языками после того, как взял класс теории языка, где мы играли с Lisp, и я слышал много хороших вещей о том, насколько продуктивным может быть Хаскелл, поэтому я решил, что сам буду исследовать его. До сих пор мне нравился этот язык, за исключением одной вещи, от которой я не могу просто уйти: эти сигнатуры функции материнской операции.
Мой профессиональный фон в основном делает OO, особенно на Java. Большинство мест, в которых я работал, забили много стандартных современных догм; Agile, Clean Code, TDD и т.д. После нескольких лет работы таким образом, он определенно стал моей зоной комфорта; особенно идея о том, что "хороший" код должен быть самодокументирован. Я привык работать в среде IDE, где длинные и многословные имена методов с очень описательными сигнатурами не являются проблемой с интеллектуальным автоматическим завершением и огромным набором аналитических инструментов для навигации пакетов и символов; если я могу нажать Ctrl + Space в Eclipse, тогда выведите то, что делает метод, глядя на его имя и локально ограниченные переменные, связанные с его аргументами, вместо того, чтобы поднять JavaDocs, я так же счастлив, как свинья в корме.
Это, безусловно, не является частью лучших практик сообщества в Haskell. Я прочитал много разных мнений по этому вопросу, и я понимаю, что сообщество Haskell считает его лаконичность "про". Я прошел через Как прочитать Haskell, и я понимаю обоснование множества решений, но это не значит, что мне нравится их; имена переменных в одну букву и т.д., мне не интересно. Я признаю, что мне придется привыкнуть к этому, если я хочу продолжать взламывать язык.
Но я не могу получить надписи функций. Возьмем этот пример, как вытащил из Узнайте о разделе Haskell [...] о синтаксисе функции:
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"
| weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = "You're a whale, congratulations!"
Я понимаю, что это глупый пример, который был создан только для объяснения стражей и ограничений класса, но если бы вы рассматривали только подпись этой функции, вы бы не поняли, какие из ее аргументов были предназначены для быть весом или высотой. Даже если бы вы использовали Float
или Double
вместо любого типа, это все равно не было бы сразу различимым.
Сначала я думал, что буду симпатичным, умным и блестящим и попытаюсь подделать его, используя более длинные имена переменных типа с несколькими ограничениями класса:
bmiTell :: (RealFloat weight, RealFloat height) => weight -> height -> String
Это выплюнула ошибку (как в сторону, если кто-нибудь может объяснить мне ошибку, я был бы благодарен):
Could not deduce (height ~ weight)
from the context (RealFloat weight, RealFloat height)
bound by the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:(25,1)-(27,27)
`height' is a rigid type variable bound by
the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:25:1
`weight' is a rigid type variable bound by
the type signature for
bmiTell :: (RealFloat weight, RealFloat height) =>
weight -> height -> String
at example.hs:25:1
In the first argument of `(^)', namely `height'
In the second argument of `(/)', namely `height ^ 2'
In the first argument of `(<=)', namely `weight / height ^ 2'
Не понимая полностью, почему это не сработало, я начал Googling, и я даже нашел этот небольшой пост, который предлагает именованные параметры, в частности spoofing named parameters через newtype
, но это кажется немного большим.
Нет ли приемлемого способа обработки сигнатур информационных функций? Является ли "Путь Хаскелла" просто для того, чтобы вытащить дерьмо из всего?