haskell中的匹配错误

haskell中的匹配错误,haskell,Haskell,我在haskell中有以下代码 无法将类型[Int]与'Bool'匹配 无法将类型[[a0]]->[a0]'与[Int]'匹配 预期类型:[Int]->[Int] 实际类型:[Int]->[[a0]]->[a0] 代码: findlist:: [[Int]] -> [Int] findlist (l1, l2, l3, l4, l5) = do 1) let n = length l1 e1 <- [1..n] e2 <- [1..n]

我在haskell中有以下代码

  • 无法将类型[Int]与'Bool'匹配
  • 无法将类型
    [[a0]]->[a0]'与
    [Int]'匹配
    预期类型:[Int]->[Int]
    实际类型:[Int]->[[a0]]->[a0]
  • 代码:

    findlist:: [[Int]] -> [Int] 
    findlist (l1, l2, l3, l4, l5) = do      1)
        let n = length l1
        e1 <- [1..n]
        e2 <- [1..n]
        e3 <- [1..n]
        e4 <- [1..n]
        e5 <- [1..n]
        let list1 = pick_list $ myperms e1 l1   --here
            list2 = pick_list $ myperms e2 l2   --here
            list3 = pick_list $ myperms e3 l3   --here
            list4 = pick_list $ myperms e4 l4   --here
            list5 = pick_list $ myperms e5 l5   --here
        guard $ all (== list1) $ [list2, list3, list4, list5]
        guard $ e1 `notElem` [e2, e3, e4, e5]
        guard $ e2 `notElem` [e3, e4, e5]
        guard $ e3 `notElem` [e4, e5]
        guard $ e4 `notElem` [e5]
        return concat list1                    2)
    

    这有什么问题?我怎么知道我什么时候会犯这样的错误?提前谢谢

    您的
    where
    子句需要缩进到
    findlist
    下面。然而,这段代码有更多的问题


    我看到的第一个大问题是,您得到的是
    列表的特定元素,但您没有确保它至少有5个元素。也许你应该传入一个元组

    其次,您在where子句中引用了
    elem1
    elem2
    等,但它们不在列表理解范围之外,不能在方括号之外使用

    第三,你的理解将返回
    list1
    的副本,在你庞大的列表理解条件下,每成功匹配一个副本。即使它可以编译,我也不认为这段代码能达到你想要的效果


    你可以用一元的形式写。我冒昧地使用
    Control.Monad.guard
    简化了您的检查,并去掉了
    元素

    findlist (l1, l2, l3, l4, l5) = do
        let n = length l1
        e1 <- [1..n]
        e2 <- [1..n]
        e3 <- [1..n]
        e4 <- [1..n]
        e5 <- [1..n]
        let list1 = pick_list $ myperms e1 l1
            list2 = pick_list $ myperms e2 l2
            list3 = pick_list $ myperms e3 l3
            list4 = pick_list $ myperms e4 l4
            list5 = pick_list $ myperms e5 l5
        guard $ all (== list1) [list2, list3, list4, list5]
        guard $ e1 `notElem` [e2, e3, e4, e5]
        guard $ e2 `notElem` [e3, e4, e5]
        guard $ e3 `notElem` [e4, e5]
        guard $ e4 `notElem` [e5]
        return list1
    
    findlist(l1、l2、l3、l4、l5)=do
    设n=长度l1
    
    e1 1)我将where放在findlist下面,但仍然存在相同的错误。2) 名单上肯定有5名成员。规格上有,你说的范围是对的,但是elem1,elem2。。。用于where定义。也许那不算数。。4) 只有一个列表1符合所有条件。@BillyGrande检查我的编辑。2) 如果您的规范说明
    list
    有5个元素,请使用5元组。3) 如果在where定义中需要
    elem1
    等,则必须将它们作为
    let
    s进行理解,这正是scope在Haskell中的工作方式。4) 在我将代码重新格式化为一元形式后,我发现您正试图根据所有这些条件找到一个特定的列表。1)忘了提到n=length(l1)2)不在范围内:`guard'@BillyGrande我对您为什么会出现语法错误的另一个猜测是,您以错误的方式格式化了您的理解,导致语法错误,或者你混合了标签和空格。我想检查一下,但是如果没有
    findlist
    myperms
    pick_list
    @BillyGrande的类型签名,我就无法编译您的代码,因为您必须导入
    控件.Monad
    ,这就是为什么我将它指定为
    Control.Monad.guard
    …我不知道您有什么错误。如果我输入
    myperms::Int->[Int]->[[Int]]]
    myperms=undefined
    pick_list::[[Int]]->[Int]
    <代码>拾取列表=未定义
    。此外,我怀疑您是否试图编译这段精确的代码,因为
    findlist
    需要一个5元组,而不是一个列表,但您显然给了它一个类型签名,表示它需要一个列表。这是我在这段代码中遇到的唯一编译错误。现在还可以,但速度很慢。我曾考虑过限制e1、e2等的范围,但我需要一个函数来删除给定列表的给定子列表。在这种情况下,它类似于e2
    findlist (l1, l2, l3, l4, l5) = do
        let n = length l1
        e1 <- [1..n]
        e2 <- [1..n]
        e3 <- [1..n]
        e4 <- [1..n]
        e5 <- [1..n]
        let list1 = pick_list $ myperms e1 l1
            list2 = pick_list $ myperms e2 l2
            list3 = pick_list $ myperms e3 l3
            list4 = pick_list $ myperms e4 l4
            list5 = pick_list $ myperms e5 l5
        guard $ all (== list1) [list2, list3, list4, list5]
        guard $ e1 `notElem` [e2, e3, e4, e5]
        guard $ e2 `notElem` [e3, e4, e5]
        guard $ e3 `notElem` [e4, e5]
        guard $ e4 `notElem` [e5]
        return list1