【问题标题】:Haskell - list traversing [closed]Haskell - 列表遍历
【发布时间】:2021-06-03 15:07:44
【问题描述】:

我想遍历列表并检查每个元素是否等于字符。我怎样才能做到这一点?即使我写了 if 语句,我也会得到一个错误。如果您能提供帮助,我会很高兴。

我要遍历的示例列表:

maze = [ ['E','#','#','#'],
       [' ','#',' ',' '],
       [' ',' ',' ',' '],
       ['#','#','#','S'] ]

如果语句:

checkElement :: Char -> Bool
checkElement x = if x == '#'
  then False
  else True

【问题讨论】:

  • 欢迎来到 StackOverflow!当您的问题涉及某种错误时,发布该错误的全文通常是一个好主意,这样尝试回答您问题的人就不必猜测了。另见stackoverflow.com/help/how-to-ask
  • 由于缺乏明确性而投票结束。

标签: list if-statement haskell traversal


【解决方案1】:

最简单的方法是使用map 函数:

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs

当你想映射一个嵌套列表时,你可以使用(map . map) :: (a -> b) -> [[a]] -> [[b]]:

λ (map . map) checkElement mazes
[ [ False, True , True , True  ]
, [ False, True , False, False ]
, [ False, False, False, False ]
, [ True , True , True , False ] ]

另外值得注意的是if x then False else True可以替换成not x:

checkElement :: Char -> Bool
checkElement x = not $ x == '#'

【讨论】:

  • ...和not $ x == y 和x /= y,更有争议的是\x -> x /= y 和(/= y),此时它足够短,甚至可能不值得定义为单独的函数.
  • @DanielWagner 确实如此。我只想强调if ... then True else False 和if ... then False else True 总是不必要的复杂,这似乎是Haskell 新手的一个常见问题(即使他们不是编程新手)。
猜你喜欢
  • 2011-11-25
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
相关资源
最近更新 更多