Je me rends compte que cela pourrait être considéré comme un subjective ou peut-être une question hors-sujet, j'espère donc que, plutôt que de l'avoir fermé, il serait transféré, peut-être pour les Programmeurs.
Je commence à apprendre Haskell, surtout pour ma propre édification, et j'aime beaucoup les idées et les principes de la sauvegarde de la langue. Je suis devenu fasciné avec les langages fonctionnels après la prise d'un langage de la théorie de la classe où nous avons joué autour avec Lisp, et j'avais entendu beaucoup de bonnes choses sur la façon productive Haskell pourrait être, alors j'ai pensé étudier moi-même. Jusqu'à présent, j'aime la langue, sauf pour une chose que je ne pouvez pas simplement obtenir loin de: Ceux de la mère effing signatures de fonction.
Mon parcours professionnel est principalement de faire OO, surtout en Java. La plupart des endroits que j'ai travaillé pour avoir martelé dans un lot de la norme moderne dogmes; Agile, Code Propre, TDD, etc. Après quelques années de travail de cette façon, Elle est certainement devenue ma zone de confort; en particulier l'idée que le "bon" code doit être auto-documentation. J'ai pris l'habitude de travailler dans un environnement de développement, où de long et détaillé des noms de méthode avec de très descriptif, les signatures sont un non-problème avec les intelligent de saisie semi-automatique et un large éventail d'outils analytiques pour la navigation dans des packages et des symboles; si je puis appuyez sur Ctrl+Espace dans Eclipse, puis en déduire qu'une méthode est de faire de la recherche à son nom et l'localement étendue des variables associées à ses arguments, au lieu de tirer vers le haut la Javadoc, je suis heureux comme un cochon dans la merde.
C'est, décidément, ne fait pas partie de la communauté de meilleures pratiques en Haskell. J'ai lu beaucoup d'avis différents sur la question, et je comprends que le Haskell communauté considère sa concision d'être un "pro". Je suis passé par Comment Lire Haskell, et je comprends la logique derrière un grand nombre de décisions, mais cela ne veut pas dire que je l'aime; une lettre de noms de variables, etc. ne sont-ce pas amusant pour moi. Je reconnais que je vais devoir m'habituer à tout ça si je veux garder le piratage avec la langue.
Mais je ne peux pas obtenir plus de la fonction de signatures. Prenez cet exemple, tiré d' Apprendre que vous avez un Haskell[...]'la section sur la syntaxe de la fonction:
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!"
Je me rends compte que c'est un exemple stupide qui a été créé uniquement dans le but d'expliquer les gardes et les contraintes de classe, mais si vous examinez juste la signature de cette fonction, vous n'avez aucune idée de qui de ses arguments était destiné à être le poids ou la hauteur. Même si vous étiez à utiliser Float
ou Double
au lieu de tout type, il serait encore de ne pas être immédiatement visibles.
Au début, je pensais que je serais mignon et intelligent et brillant et d'essayer d'usurper l'aide de plus les noms de variables avec de multiples contraintes de classe:
bmiTell :: (RealFloat weight, RealFloat height) => weight -> height -> String
Cette recraché une erreur (en aparté, si quelqu'un peut expliquer l'erreur pour moi, je lui en serais reconnaissant):
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'
Ne pas comprendre complètement pourquoi cela ne fonctionne pas, j'ai commencé à Googler autour, et j'ai même trouvé ce petit post qui suggère que les paramètres nommés, plus précisément, l'usurpation des paramètres nommés par newtype
, mais qui semble un peu beaucoup.
N'est-il pas une manière acceptable pour l'artisanat instructif signatures de fonction? Est "Le Haskell Façon" simplement pour l'Aiglefin la merde hors de tout?