【问题标题】:Haskell multidimensional list : Beginner problemsHaskell 多维列表:初学者问题
【发布时间】:2013-05-02 02:35:56
【问题描述】:

我想删除列表中以“h”开头的每个字符串。

["hawrw", "basw", "HasD" , "hgkas"] => ["basw", "HasD"]

我的代码是:

kat (x:xs) = if head x == "h" then kat(xs) else x ++ kat(xs)

为什么它不起作用?以及如何修复我的代码?

【问题讨论】:

  • 定义“不起作用”
  • :1:4: 无法匹配预期类型[[[Char]]]' with actual type (t0, t1)' 在kat', namely ("abc", "hef")' 的第一个参数中表达式: kat ("abc", "hef") 在 'it' 的等式中:it = kat ("abc", "hef") 这就是我得到的错误。我只想检查每个字符串的第一个元素是否为 == "h"。如果它是 == "h" 那么我只需将列表的其余部分放入我的函数中如果它不是 == "h" 那么我想保留第一个字符串并将我的函数应用于列表的其余部分.

标签: list haskell recursion multidimensional-array


【解决方案1】:
  • 您需要一个基本案例:kat [] = []
  • "h" 是一个字符串,你想和一个字符进行比较,使用:'h'
  • ++是字符串拼接,你要创建一个列表,用:代替。

注意事项:

  • head 不安全,并且会以空的 "" 字符串失败。您可以使用 null x 进行测试。
  • 惯用的方法是使用 filter,因为您确实在过滤。
  • 使用类型签名及早检测错误并获得更有意义的错误消息。

【讨论】:

  • 感谢我是函数式编程的新手。
【解决方案2】:

filterList = filter (\x -> head x /= 'h')

您的代码不起作用,因为String 的头部不是String。当您使用 "h" 时,它是 Char,您的意思是只有一个元素的 String。

【讨论】:

    【解决方案3】:

    当然,Diego 的过滤器解决方案是首选的“真实世界”样式,但是如果您想修复您的示例,为什么不使用更多的模式匹配呢?毕竟,字符串只是列表。

    kat (('h':_):xs) = kat xs
    kat (x:xs) = x : kat xs
    kat [] = []
    

    另一个不错的方法是使用列表推导:

    kat xs = [ys | ys@(y:_) <- xs, y /= 'h']
    

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2020-05-18
      • 2011-11-07
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多