Haskell 不能';与包函数中的预期类型不匹配

Haskell 不能';与包函数中的预期类型不匹配,haskell,Haskell,我正在处理Haskell中的99个问题,遇到了一个无法解决的类型问题。第一次尝试时,我使用了一个包装函数来解决这个问题 目标 将列表元素的连续副本打包到子列表中。如果列表包含重复的元素,则应将它们放在单独的子列表中 例子: 我的代码: 因此,当我运行此程序时,第7行出现问题,并获得以下调试器输出: 09.hs:7:15: Couldn't match expected type `[a0] -> [[a]]' with actual type `[

我正在处理Haskell中的99个问题,遇到了一个无法解决的类型问题。第一次尝试时,我使用了一个包装函数来解决这个问题

目标 将列表元素的连续副本打包到子列表中。如果列表包含重复的元素,则应将它们放在单独的子列表中

例子: 我的代码: 因此,当我运行此程序时,第7行出现问题,并获得以下调试器输出:

09.hs:7:15:
    Couldn't match expected type `[a0] -> [[a]]'
                 with actual type `[[a]]'
    The function `(filter (== head ys) ys) : xs'
    is applied to one argument,
    but its type `[[a]]' has none
    In the expression: ((filter (== head ys) ys) : xs) (filter (/= head ys) ys)
    In an equation for pack':
        pack' xs ys = ((filter (== head ys) ys) : xs) (filter (/= head ys) ys)
Failed, modules loaded: none.
我只是不知道额外的[a0]->[a]]是从哪里来的

Prelude> let b = [5,3,4,5,3,2,3,4,5,6]
Prelude> (filter (== head b) b):[]
[[5,5,5]]
Prelude> (filter (== head b) b):[[4,4]]
[[5,5,5],[4,4]]

我脑子里有点不对劲。有人能解释一下我遗漏了什么吗?

这第七行有点奇怪:

((filter (== head ys) ys):xs) (filter (/= head ys) ys)
它说的是:

  • ((filter (== head ys) ys):xs)
    
  • 用论点来称呼它

    (filter (/= head ys) ys)
    
  • 这可能根本不是你想要的。如果将表达式替换为名称(如以下等效表达式),则这一点会更加清楚:

    let func = ((filter (== head ys) ys):xs)
        arg  = (filter (/= head ys) ys)
    in  func arg
    
    你没有在这两个表达之间加上什么吗?请记住,在本例中,
    arg
    [a]
    ,而
    func
    [a]
    。我想你是想说

    func : [arg]
    

    但我不确定,因为我不知道你想要实现什么。

    这第七行有点奇怪:

    ((filter (== head ys) ys):xs) (filter (/= head ys) ys)
    
    它说的是:

  • ((filter (== head ys) ys):xs)
    
  • 用论点来称呼它

    (filter (/= head ys) ys)
    
  • 这可能根本不是你想要的。如果将表达式替换为名称(如以下等效表达式),则这一点会更加清楚:

    let func = ((filter (== head ys) ys):xs)
        arg  = (filter (/= head ys) ys)
    in  func arg
    
    你没有在这两个表达之间加上什么吗?请记住,在本例中,
    arg
    [a]
    ,而
    func
    [a]
    。我想你是想说

    func : [arg]
    

    但是我不确定,因为我不知道您想要完成什么。

    表达式
    pack'xs ys=((filter(=head ys)ys):xs)(filter(/=head ys)ys)
    包含错误。子表达式
    ((filter(=head ys)ys):xs)
    用作函数,其参数为
    (filter(/=head ys)ys)
    。但是,
    ((filter(=head ys)ys):xs)
    具有类型
    [[a]]
    ,因为
    filter(=head ys)ys
    返回类型为
    [a]
    的值,并将其附加到
    xs
    的前面,该类型为
    [[a]]


    pack'
    的预期返回值是多少?你能提供一个例子来演示它的行为吗?

    表达式
    pack'xs ys=((filter(=head ys)ys):xs)(filter(/=head ys)ys)
    包含错误。子表达式
    ((filter(=head ys)ys):xs)
    用作函数,其参数为
    (filter(/=head ys)ys)
    。但是,
    ((filter(=head ys)ys):xs)
    具有类型
    [[a]]
    ,因为
    filter(=head ys)ys
    返回类型为
    [a]
    的值,并将其附加到
    xs
    的前面,该类型为
    [[a]]


    pack'
    的预期返回值是多少?你能提供一个例子来演示它的行为吗?

    是的,我忘了递归调用pack。这是一个让我感到沮丧的案例……唉。也许我应该删除这个问题是的,我忘了递归调用pack。这是一个让我感到沮丧的案例……唉。也许我应该从
    数据中删除与
    组相同的问题
    pack
    。我只想在不重命名函数的情况下执行此操作。
    仅对连续的重复项进行组,仅供参考。感谢您更正我的错误更正@kqr@kqr这不是pack在这里做的吗?
    pack
    Data中的
    group
    相同。List
    正确,我只是在解决一些练习。我只想在不重命名函数的情况下执行此操作。
    仅对连续的重复项进行组,仅供参考。感谢您更正我的错误更正@kqr@kqr那不是帕克在这里干的事吗?