Haskell: Qual è il tipo di questa funzione?
Domanda
mifun s = foldr op 0 s
where op x r = head x + r
C'è un modo per rendere ghci dirmi?
Soluzione
prova :t mifun
(abbreviazione di :type mifun
)
che dà
*Main> :t mifun
mifun :: (Num b) => [[b]] -> b
Quindi, per un b
un'istanza di num
, mifun
prende una lista di liste di b
ed emette un singolo b
(che in questo caso è la somma dei primi elementi delle liste).
Altri suggerimenti
Questo non è davvero una risposta, ma avevo bisogno di formattazione.
NB:. mifun
è ⊥ se alcuna delle liste contenuti è vuoto. Ad esempio:
> mifun [[3], [5, 8], [], [1, 2, 3]]
*** Exception: Prelude.head: empty list
Se si desidera che il risultato dell'esempio qui sopra per essere 9 (il trattamento di una lista vuota che non contribuiscono alla somma), allora è necessario definire op come uno dei seguenti modi:
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
probabilmente sarei preferisco la prima.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow