无法将预期类型(Int - > Int - > Int)与实际类型`(t0,t1,t2)'匹配

时间:2011-08-29 15:39:23

标签: haskell types tuples

我是初学者,在尝试进入计算机科学大学之前,我正在尝试在Haskell上做一些教程。

我被困在这个程序中。它需要三个数字并按升序排列。任何人都可以帮助我并告诉我什么是错的,因为它让我发疯了?谢谢你的时间。

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

错误是:

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

2 个答案:

答案 0 :(得分:6)

您为编译器提供了错误的类型信息:

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

应该是

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

第一次打字声称orderTriple将一个函数(从两个Int转换为一个)转换为另一个这样的函数,这完全不是你的代码所做的。

(另外:用于研究CS 准备用于CS程序的+1)。

答案 1 :(得分:2)

箭头->分隔函数的参数。 (实际上它有点复杂)但是要分隔元组的参数,请使用逗号:

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

如果是其他类型,空间就足够了:

Either String Int