【问题标题】:Convert even numbers within a list to 1 and odds to 0. Bug with commas将列表中的偶数转换为 1,将赔率转换为 0。带有逗号的错误
【发布时间】:2014-12-08 20:05:14
【问题描述】:

所以正如标题所解释的那样,我可以将每个偶数和奇数转换为它们对应的值,但是在输入数据时我有一个逗号。这会产生额外的L[]。让我向您展示我的预期结果。

预期结果> binariza (L [E 1,L [E 2,E 3],E 4]) => L [E 0,L [E 1,E 0],E 1]

我的结果> binariza (L [E 1,L [E 2,E 3],E 4]) => L [E 0,L [L [E 1,L [E 0,L []]],L [E 1,L []]]]

这是我的代码,有人可以解释一下如何避免每次找到逗号时都将所有内容封装在 L[] 中。

data LA e = L [LA e] | E e deriving Show

binariza :: LA Integer -> LA Integer 
binariza (L[]) =  L[]
binariza (E num) =
     if (even num) then
        E 1
        else
            E 0
 binariza (L (x:resto)) =
     L [(binariza x), (binariza (L resto))]

注意:我的解决方案必须是递归的。

【问题讨论】:

    标签: list haskell recursion tree nested-lists


    【解决方案1】:

    请记住,[a,b,c,d] 是 a:b:c:d:[].. 的简写。所以额外的 [] 来自额外的空数组。

    您真正想要的是将binariza 映射到数组中的每个元素上,您可以使用map 来做到这一点。

    由于“我的解决方案必须是递归的”=“这是作业”,我不会向您展示实际的行,但您应该能够轻松地重写上面函数中的最后一个案例以使用 map 并获得正确答案。

    【讨论】:

    • 谢谢@jamshidh!我只是在寻找建议或解释。尽管我有一个问题,但使用 map 不会像我认为的那样使其递归,对吗? “映射(验证是偶数还是奇数,然后将值替换为 0 或 1)L[...]”。如果你能指导我,那它怎么可能是递归的
    • 由于 binariza 调用 binariza,它是递归的.... 要点是 binariza 一直应用到树的下方。如果你只是改变上面的最后一种情况,递归仍然会非常明确。
    • 我不断收到此错误:“无法将预期类型‘LA Integer’与实际类型‘[LA Integer]’匹配”。起初我尊重“地图功能列表”,但是根据我放置地图的位置,我最终也会遇到这个错误“无法将预期类型'[LA Integer]'与实际类型'LA Integer'匹配”可能请解释一下原因
    • 这些错误意味着您正在使用一个需要项目的列表,反之亦然....如果没有看到代码,我不确定,但请记住,如果您想从模式匹配中拉出完整列表,使用f (L theList),如果使用f (L (item:rest)),那么item是一个简单的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2017-06-04
    • 2021-06-02
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多