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’
答案 0 :(得分:3)
您要问的特定错误是由于此部分而发生的:
case (id,fid) of
(val1,val2) -> if(val1==val2)
then (fname,(nameAcc++[name]) )
else (fname,nameAcc)
(Nothing , _) -> (fname,nameAcc)
-- ^^^^^^^
id
是Integer
,但您尝试将其与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)