【问题标题】:From a list of tuples containing names and id , i want tuples which contains names and list of names which got the similiar id [duplicate]从包含名称和 id 的元组列表中,我想要包含名称的元组和具有相似 id 的名称列表 [重复]
【发布时间】:2018-06-01 15:36:48
【问题描述】:
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) 并给出 [(Maybe Name, [Maybe Name])] 的元组列表,其中名称列表是具有相似 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’

【问题讨论】:

  • 如果你的名字和ids匹配,用[(id, [Maybe Name])]代替[(Maybe Name, [Maybe Name])]不是更好吗?

标签: haskell


【解决方案1】:

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

                                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)

我们可以去掉一些多余的括号:

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

...并拉出公共部分:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2020-08-06
    • 2014-04-09
    相关资源
    最近更新 更多