Alex Rivera | Logout

couldn't match expected type (Int -> Int -> Int) with actual type `(t0, t1, t2)'

Asked 2011-08-29T15:39:22.993
9

I'm a beginner and I'm trying to do some tutorials on Haskell before entering uni for computer science.

I got stuck in this program. It takes three numbers and puts them in ascending order. Can anyone help me and tell me whats wrong because it's driving me crazy? Thanks for your time.

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

The error is:

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)]
Edit
Report

1 Answer

6

You give the compiler wrong type information:

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

should be

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

The first typing claims that orderTriple converts a function (from two Ints to one) into another such function, which is not at all what your code does.

(Also: +1 for studying FP in preparation for a CS program).

answered 2011-08-29T15:50:23.707

Your Answer