从包含名称和id的元组列表中,我想要包含名称和名称列表的元组,它们具有类似的id

时间:2018-06-01 06:37:25

标签: haskell

datatest :: [(Maybe String,Integer)]
datatest = [(Just "name1" , 111), (Just "name2" , 222), (Nothing, 333), (Just "name4",111)]

需要像这样的输出

[(Just "name1",[Just "name1",Just "name4"]),(Just "name2",[Just "name2"]),(Nothing,[]),(Just "name4", [Just "name1",Just "name4"])]

在test123中,它包含一个元组列表,其中包含(Maybe Name,Id)并给出[(可能名称,[可能名称])]这里的名称列表是具有相似id的名称

test123 :: [(Maybe String, Integer)] -> [(Maybe String,[Maybe String])]
test123 rows = 
  fmap (\(name,id) -> 
                DL.foldl' (\(rowAcc,nameAcc) (fname,fid) -> 
                                    case (id,fid) of
                                      (val1,val2) ->  if(val1==val2)
                                                        then (fname,(nameAcc++[name]) )
                                                      else (fname,nameAcc)
                                      (Nothing , _) -> (fname,nameAcc)          
                  ) ("",[]) rows
    ) rows

这是我编写的代码,但是我遇到了编译错误。

以下是我在编译时遇到的错误:

error:
    • Couldn't match type ‘Integer’ with ‘Maybe t0’
      Expected type: [(Maybe String, Maybe t0)]
        Actual type: [(Maybe String, Integer)]
    • In the third argument of ‘DL.foldl'’, namely ‘rows’

error:
    • Couldn't match type ‘Integer’ with ‘Maybe t0’
      Expected type: [(Maybe String, Maybe t0)]
        Actual type: [(Maybe String, Integer)]
    • In the second argument of ‘fmap’, namely ‘rows’

1 个答案:

答案 0 :(得分:3)

您要问的特定错误是由于此部分而发生的:

                                case (id,fid) of
                                  (val1,val2) ->  if(val1==val2)
                                                    then (fname,(nameAcc++[name]) )
                                                  else (fname,nameAcc)
                                  (Nothing , _) -> (fname,nameAcc)
--                                 ^^^^^^^

idInteger,但您尝试将其与Nothing进行模式匹配,这是一个Maybe something

这个case分支毫无意义。它也无法访问,因为(val1,val2)之前总是匹配(它不能失败),所以我们可以简单地删除Nothing模式:

                                case (id,fid) of
                                  (val1,val2) ->  if(val1==val2)
                                                    then (fname,(nameAcc++[name]) )
                                                  else (fname,nameAcc)

但为什么要使用case呢?我们所做的只是将id绑定到val1,将fid绑定到val2。我们可以使用原始变量并完全摆脱case

                                if(val1==val2)
                                   then (fname,(nameAcc++[name]) )
                                   else (fname,nameAcc)

我们可以删除一些冗余的parens:

                                if val1==val2
                                   then (fname,nameAcc++[name])
                                   else (fname,nameAcc)

...并拉出公共部分:

                                (fname, if val1 == val2
                                            then nameAcc++[name]
                                            else nameAcc)