2011-08-29 18 views
9

Soy un principiante y estoy tratando de hacer algunos tutoriales en Haskell antes de ingresar a la universidad Ciencias de la Computación.no pudo coincidir con el tipo esperado (Int -> Int -> Int) con el tipo real `(t0, t1, t2) '

Me quedé atrapado en este programa. Toma tres números y los pone en orden ascendente. ¿Puede alguien ayudarme y decirme qué pasa porque me está volviendo loco? Gracias por tu tiempo.

import Prelude hiding (min,max) 
orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 
max :: Int -> Int -> Int -> Int 
min :: Int -> Int -> Int -> Int 
middle :: Int -> Int -> Int -> Int 


max x y z 
|(x>=y) && (x>=z) = x 
|(y>=x) && (y>=z) = y 
|otherwise  = z 

min d e f 
|(d<=e) && (d<=f) = d 
|(e<=d) && (e<=f) = e 
|otherwise  = f 

middle g h i 
| (g <= (max g h i)) && (g >= (min g h i)) = g 
| (h <= (max g h i)) && (h >= (min g h i)) = h 
| otherwise     = i 

orderTriple (a,b,c) = ((min a b c),(middle a b c),(max a b c)) 

El error es:

orderList.hs:23:13: 
    Couldn't match expected type `[Int -> Int -> Int]' 
       with actual type `(t0, t1, t2)' 
    In the pattern: (a, b, c) 
In an equation for `orderTriple': 
    orderTriple (a, b, c) = [(min a b c), (middle a b c), (max a b c)] 
+0

¿En realidad va a estar haciendo Haskell (o algún tipo de FP) en la universidad? ¡Ojalá hubiera conseguido eso en mi programa! – MatrixFrog

Respuesta

6

Usted da el compilador equivocada información del tipo:

orderTriple :: (Int -> Int -> Int) -> (Int -> Int -> Int) 

debería ser

orderTriple :: (Int, Int, Int) -> (Int, Int, Int) 

La primera afirma que la tipificación orderTriple convertido s una función (de dos Ints a uno) en otra función, que no es en absoluto lo que hace tu código.

(También: +1 para estudiar FP en preparación para un programa de CS).

+0

thx mucho acerca de su ayuda, pero esta vez se trata de otro error : 1: 1: La función 'orderTriple 'se aplica a tres argumentos, pero su tipo' (Int, Int, Int) -> (Int, Int, Int) 'tiene solo uno En la expresión: orderTriple 3 1 9 En una ecuación para' it ': it = orderTriple 3 1 9 – noobie

+0

La definición de 'orderTriple' espera una tupla, es decir, coma argumentos separados entre paréntesis. Debe llamarlo de esa manera - 'orderTriples (3,1,9)' - no con tres argumentos separados por espacios (curried) sin paréntesis. –

+0

@noobie: También es posible que desee comprobar que está utilizando corchetes '()' en lugar de los cuadrados '[]' en la definición de 'orderTriple'. El mensaje de error que das es diferente del código que se encuentra arriba ... – yatima2975

2

Una flecha -> separa los argumentos de una función. (En realidad es un poco más sofisticado) Pero para separar los argumentos de una tupla, utilice una coma:

orderTriple :: (Int,Int,Int) -> (Int,Int,Int) 

En el caso de otros tipos, un espacio es suficiente:

Either String Int 
Cuestiones relacionadas