Je suis en train de jouer autour avec débutant Haskell, et j'ai voulu écrire une fonction moyenne. Cela semblait être la chose la plus simple du monde, non?
Mal.
Il semble que Haskell type de système interdit moyen de travailler sur un générique de type numérique - je peux le faire fonctionner sur une liste d'Intégrales, ou une liste de Fractionals, mais pas les deux.
Je veux:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
Mais je ne peux faire:
averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs)
ou
averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs / fromIntegral (length xs)
et le second semble fonctionner. Jusqu'à ce que j'essaie de passer une variable.
*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x
<interactive>:1:0:
No instance for (Fractional Integer)
arising from a use of `averageFrac ' at <interactive>:1:0-8
Possible fix: add an instance declaration for (Fractional Integer)
In the expression: average x
In the definition of `it': it = averageFrac x
Apparemment, Haskell est vraiment pointilleux à propos de ses types. Qui fait sens. Mais pas quand ils pourraient à la fois être [Num]
Suis-je en manque d'une application évidente de RealFrac?
Est-il moyen de forcer les Intégrales en Fractionals qui ne veut pas s'étouffer quand il obtient une fraction d'entrée?
Est-il un moyen d'utiliser Either
et either
de faire une sorte de polymorphe fonction moyenne qui serait à l'œuvre sur tout type de tableau numérique?
Ne Haskell type de système de carrément interdire cette fonction déjà existante?
Apprendre Haskell, c'est comme apprendre le Calcul. C'est vraiment compliqué et basé sur les montagnes de la théorie, et parfois, le problème est donc mindbogglingly complexe que je ne sais même pas assez pour une phrase correctement à la question, de sorte que toute la perspicacité seront chaleureusement accueillis.
(Aussi, note de bas de page: c'est un problème. Tout le monde est d'accord que averageFrac, ci-dessus, obtient la totalité des points, mais j'ai l'intuition qu'il existe un moyen de le faire fonctionner sur les deux Intégrales ET de la fraction de tableaux)