Haskell从另一个等式中找到列表的长度

时间:2014-10-27 14:44:26

标签: list haskell

所以我有一个方程式,返回给定int的列表。我想把它放到另一个等式中,以查看长度是长度为1还是2,如果长度为1则返回True,否则返回False。

con :: Int -> [Int] -> Bool
con getList x
    | length x == 1 = True
    | otherwise     = False

这是我能得到的最接近的但它会抛出错误

ERROR - Cannot find "show" function for:
*** Expression : con 3
*** Of type    : [Int] -> Bool

2 个答案:

答案 0 :(得分:5)

错误原因

错误是由于您的con具有类型:

 Int -> [Int] -> Bool

这意味着它需要两个参数(类型为IntInt的列表)才能返回布尔值。

现在,表达式con 3只是将3应用于con(提供一个参数),返回一个带有Int列表的函数并返回{{1 }}

此函数的类型为Bool,函数没有[Int] -> Bool实例(〜无法在屏幕上打印)。

你可能意味着什么

您似乎不需要Show,因此您可以使用:

getST

Live demo

有一个给定列表的函数返回一个bool,这样:如果列表的长度为con :: [a] -> Bool con = (== 1) . length ,则返回值为1,否则为True

如果您只想传递列表的长度,那么事情会变得更简单:

False

Live demo

答案 1 :(得分:1)

我同意另一种解释,即您可能只需要一个直接使用列表的函数,但是如果您打算将con的第一个参数作为类型的函数 Int -> [Int],然后您希望con检查应用于Int参数的该函数的结果是否最终为长度为1,然后您可以执行此操作:

con :: (Int -> [Int]) -> Int -> Bool
con f = (== 1) . length . f

现在假设您有一个不同的函数,可以从给定的Int生成Int的列表。也许输出的长度根据输入是偶数还是奇数而不同:

getList :: Int -> [Int]
getList x
    | odd x = [x, x, x]
    | otherwise = [x]

然后我们可以使用con检查输出的长度是否为1:

con getList 3 -- Will be False
con getList 2 -- Will be True