2010-12-02 32 views
3

J'ai défini la fonction f1Simplifier une fonction laide dans Haskell

f1 p = foldl (\x y -> x ++ y ++ "\t") "" (map (foldl (++) "") p) 

qui prendra

[["4","0","1"],["5","2","3"]] 

et le rendement

"401\t523\t" 

mais est fonction aussi laid que possible obtenir. Je suis sûr qu'il existe un moyen plus simple d'implémenter la même fonction. Quelqu'un peut-il me donner une idée à ce sujet?

Répondre

9

La composition de la fonction est votre ami. Ainsi est intercalé, à partir de Data.List

f1 = intercalate "\t" . map concat 

Modifier: whoops, mal lu votre sortie. Vous voulez "\ t" à la fin de tous, pas seulement entre eux. Dans ce cas, il est plus proche de

f1 = concat . map ((++ "\t") . concat) 
+0

Cela n'inclut pas le '' \ t'' à la fin. – dave4420

+0

Bon. Malheureusement, je ne suis pas autorisé à utiliser Data.List pour ce projet :( –

+2

elysium dévoré, eh bien, ma deuxième fonction n'utilise rien de Data.List – Carl

3

Une suggestion pour l'approche pour résoudre quelque chose de semblable à cela à l'avenir (supplimenting solution réelle de Carl), ce que vous pouvez faire est de regarder comment un résoud bibliothèque Haskell le problème. Par exemple, Data.List.unwords fait quelque chose de similaire à ce que vous voulez.

Ainsi, vous pouvez essayer de regarder dans:

http://hackage.haskell.org/packages/archive/base/4.3.0.0/doc/html/Data-List.html

Trouver unwords dans ce document, vous remarquerez qu'il ya un lien "source". Cliquer ici vous amènera à la source de la façon dont la bibliothèque l'implémente. Habituellement, la fonction n'est pas très grande et peut vous donner quelques idées sur la façon de généraliser (ou de spécialiser) votre fonction de la bibliothèque.