所以我有一个方程式,返回给定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
答案 0 :(得分:5)
错误是由于您的con
具有类型:
Int -> [Int] -> Bool
这意味着它需要两个参数(类型为Int
和Int
的列表)才能返回布尔值。
现在,表达式con 3
只是将3
应用于con
(提供一个参数),返回一个带有Int
列表的函数并返回{{1 }}
此函数的类型为Bool
,函数没有[Int] -> Bool
实例(〜无法在屏幕上打印)。
您似乎不需要Show
,因此您可以使用:
getST
有一个给定列表的函数返回一个bool,这样:如果列表的长度为con :: [a] -> Bool
con = (== 1) . length
,则返回值为1
,否则为True
。
如果您只想传递列表的长度,那么事情会变得更简单:
False
答案 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