2010-04-04 3 views

Répondre

11

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).

2

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.

+1

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

+0

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

Questions connexes