当前位置: 首页 > 知识库问答 >
问题:

Haskell从另一个等式求列表的长度

唐弘益
2023-03-14

所以我有一个等式,它返回一个给定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个答案

百里弘致
2023-03-14

我同意另一种解释,即您可能只需要一个直接与列表一起工作的函数,但如果您打算将con的第一个参数作为Int类型的函数-

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

赵星华
2023-03-14

该错误是由您的con类型导致的:

 Int -> [Int] -> Bool

这意味着它需要两个参数(分别为Int类型和Ints列表)来返回布尔值。

现在,表达式con 3只是将3应用于con(提供一个参数),返回一个函数,该函数接受Ints的列表并返回Bool

此函数的类型为[Int]-

您似乎不需要getST,所以您可以使用:

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

现场演示

要使给定列表的函数返回布尔值,则:如果列表的长度为1,则返回值为True,否则返回值为False

如果你只想通过列表的长度,那么事情就变得更简单了:

con :: Int -> Bool
con = (== 1)

现场演示

 类似资料:
  • 我想写一个函数来检查第一个列表是否比第二个列表长,并且其中一个列表可以是无限的。但是我找不到一个工作的解决方案。

  • 我是一名Java程序员初学者。我试图在类交通中访问类车中的两个列表,这样我就可以执行while循环,循环直到主类中的列表为空 这就是我现在掌握的代码,我试着从普通车上扩展流量,但没有成功,我被卡住了。我该怎么解决这个问题?

  • 问题内容: 我有看起来像的数据框: 为了进一步处理数据,我需要拆分该列,然后将其替换为如下所示的多列: 因此,这些列可以追加到初始数据帧。我不知道该怎么做,因为像 不能解决我的问题,因为我不仅需要基于列表中位置的列,还需要基于列表中每个唯一值的列。您知道我该如何处理吗? 问题答案: 您可以使用和: 如果需要计数值,则可以使用(我添加一个字符串进行测试):

  • 我正在练习计算let表达式的问题,但我不理解这个表达式的输出。 下面是一个表达: 输出应该是[1,2,4,8]。有人能一步一步地解释为什么这是输出吗

  • 我在课堂上创建了两个列表。 其中一个称为预算,包含元素section、month和sum,返回以下内容: [Budzet{sec='AGD/RTV',月='01',和=96},Budzet{sec='AGD/RTV',月='03',和=30},Budzet{sec='食品',月='04',和=23},Budzet{sec='游戏',月='09',和=1084}...] 这是SQL查询 第二个是元素

  • 问题内容: 我有2个表,一个包含我需要的最终结果,另一个包含我需要根据设定级别选择的列列表。 例如 : 所以,如果我做以下 然后,基本上我需要使用此select语句中的列名来确定从另一条语句中选择了哪些列。 香港专业教育学院尝试过的方法,我当然知道这是错的,但可以让我对我试图做的事情有所了解。 我试图以一种动态方式构建一个sql查询,该查询可以通过我放在表中的任何列进行更改。 从理论上讲,这应与以