Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: GGZ en 24 Diciembre 2015, 03:33 am



Título: [Haskell] Ejemplos de funciones: tail, reverse, zip, etc.
Publicado por: GGZ en 24 Diciembre 2015, 03:33 am
Hola a todos!

He creado estas funciones con el fin de entender como funcionan cada una de ellas.
Por eso algunas ya están definidas como por ejemplo tail,reverse, zip, ...

Código
  1. fac 0 = 1
  2. fac n = n * fac (n-1)
  3.  
  4. replicate' 0 n = [n]
  5. replicate' x n = n:replicate (x-1) n
  6.  
  7. take' 0 xs = []
  8. take' n [] = []
  9. take' 1 xs = [head xs]
  10. take' n xs = head xs:take (n-1) (tail xs)
  11.  
  12. reverse' [] = []
  13. reverse' (x:xs)=last (x:xs):reverse'(init (x:xs))
  14.  
  15. haycero [] = False
  16. haycero (x:xs) = (x==0) || haycero (xs)
  17.  
  18. todosceros [] = error "No está definido para una lista vacía"
  19. todosceros [x] = (x==0)
  20. todosceros (x':x:xs) = (x'==0) && todosceros(x:xs)
  21.  
  22.  
  23. maximo n x = if (n>x) then n else x
  24. minimo n x = if (n>x) then x else n
  25.  
  26. maximo' n x
  27.  | n>=x = n
  28.  | n<x = x
  29.  
  30. zip' xs []         = []
  31. zip' [] ys         = []
  32. zip' (x:xs) (y:ys) = [(x,y)]  ++  zip' xs ys
  33.  
  34. zip'' xs [] = []
  35. zip'' [] ys = []
  36. zip'' (x:xs) (y:ys) = (x,y) : zip'' xs ys
  37.  
  38. nth [] n = error "No está definida para lista vacía"
  39. nth xs n = if (length xs > n) then xs !! n else error "No se puede acceder a esa posición ya que no existe"
  40.  
  41.  
  42.  
  43. {-
  44. Comprueba si un elemento dado está en la lista
  45. -}
  46.  
  47. elem' n []     = False
  48. elem' n (x:xs) = (n==x) || elem' n xs
  49.  
  50. {-
  51. ANALISIS POR CASOS
  52. -}
  53.  
  54. elem'':: Eq a => a -> [a] -> Bool
  55. elem'' n xs
  56.  | length xs==0  = False
  57.  | otherwise     = (n==head xs) || elem'' n (tail xs)
  58.  
  59. {-
  60. quicksort [10,2,5,3,1,6,7,4,2,3,4,8,9] = [1,2,2,3,3,4,4,5,6,7,8,9,10]
  61. -}
  62.  
  63.  
  64. {-
  65. zip [] []= []
  66. zip [2] [5] = [(2,5)] ++ zip [] []
  67. zip [1,2] [4,5] = [(1,4)] ++ zip[2][5]
  68. -}
  69.  
  70. length' [] = 0
  71. length' (x:xs) = 1 + length' xs
  72.  
  73. {-
  74. repeat' 0
  75. repeat'
  76. -}
  77.  
  78. map' f [] = []
  79. map' f (x:xs) = f x : map' f xs
  80.  
  81. tail' [] = []
  82. tail' (x:xs) = xs
  83.  
  84. {-
  85. filter (>3) [1,2,3,4,10,10,10,20,20,20] = [4,10,10,10,...]
  86. -}
  87.  
  88. sumatoria [] = 0
  89. sumatoria (x:xs) = x+sumatoria xs
  90.  
  91. multiplicar [] = 1
  92. multiplicar (x:xs) = x*multiplicar xs
  93.  
  94. sumatoria' xs
  95.  | length (xs) == 0 = 0
  96.  | otherwise = head xs+sumatoria' (tail xs)
  97.  
  98. multidos [] = []
  99. multidos (x:xs) = 2*x : multidos xs
  100.  
  101. multiPor n [] = []
  102. multiPor n (x:xs) = n*x : multiPor n xs
  103.  
  104. h [] = [1]
  105. h (x:xs) = (x+1) : h xs
  106.  
  107. test [] = []
  108. test (5:[]) = error "Tu lista empieza por 5"
  109.  
  110. h' [] = [1]
  111. h' (x:xs) = [(x+1)] ++ h xs
  112.  
  113. g 0 = error "El numero es cero"
  114. g n = error "El numero no es cero"
  115.  
  116. multiplicar' xs
  117. | length xs == 0 = 1
  118. | length xs /= 0 = head xs*multiplicar'(tail xs)
  119.  
  120.  
  121. filter' f [] = []
  122. filter' f (x:xs)
  123.      | f x =  x:filter' f xs
  124.      | otherwise = filter' f xs

Ejecutan ghci y lo cargan con :l <nombre-del-archivo>
Después hagan los llamados que quieran.

Perdón como se ve, no hay una etiqueta para Haskell.

Saludos!