mifun s = foldr op 0 s
where op x r = head x + r
Existe-t-il un moyen de faire savoir à ghci?Haskell: Quel est le type de cette fonction?
mifun s = foldr op 0 s
where op x r = head x + r
Existe-t-il un moyen de faire savoir à ghci?Haskell: Quel est le type de cette fonction?
essayer :t mifun
(abréviation de :type mifun
)
qui donne
*Main> :t mifun
mifun :: (Num b) => [[b]] -> b
Ainsi, pour un b
une instance de num
, mifun
prend une liste de listes de b
et émet un seul b
(qui ce cas est la somme des premiers éléments des listes).
Ce n'est pas vraiment une réponse, mais j'avais besoin de la mise en forme.
N.B. .:mifun
est ⊥ si l'une des listes contenues est vide. Par exemple:
> mifun [[3], [5, 8], [], [1, 2, 3]]
*** Exception: Prelude.head: empty list
Si vous voulez que le résultat de l'exemple ci-dessus pour être 9 (le traitement d'une liste vide comme ne contribuant pas à la somme), alors vous devez définir op comme l'une des façons suivantes:
mifun s = foldr op 0 s
where op [] r = r
op (x:_) r = x + r
mifun s = foldr op 0 s
where op x r = (if null x then 0 else head x) + r
mifun s = foldr op 0 s
where op x r = sum (take 1 x) + r
Je préférerais probablement le premier.
En fait, si vous définissez une instance de Num assez paresseuse, 'mifun [[3 :: MyLazyNum], [5, 8], [], [1, 2, 3]]> = 8' pourrait être évalué à true sans provoquer d'exception, il peut donc être plus précis de dire "Le résultat de' mifun' * contient * ⊥ si l'une des listes contenues est vide ". – sepp2k
Assez vrai - Je peux penser à encore plus d'instances avec un comportement bizarre dans ce cas ... Cependant, étant donné l'objet de la question initiale, je parierais qu'ils travaillent avec des instances standard de Num, et je voulais souligner un potentiel piège de la fonction elle-même. – MtnViewMark