如何获取元素elt和列表xs,并返回Just元素 在xs中第一次出现elt之前,如果它存在。例如,
elementBefore ’h’ "elephant" -- should return Just ’p’
elementBefore ’z’ "elephant" -- should return Nothing
我的计划有什么问题?感谢。
elementBefore :: Eq a => a -> [a] -> Maybe a
elementBefore elt [] = Nothing
elementBefore elt [x] = Nothing
elementBefore elt xs | head (tail xs) == elt = Just (head xs)
| otherwise elementBefore elt (tail xs)
答案 0 :(得分:3)
在评论中充分发现,otherwise
(这只是True
的同义词)需要=
标志,就像任何其他警卫一样,但我做了其他一些调整。
可能更好地避免部分函数head
和tail
,特别是因为有一种很好的方法可以通过模式匹配来解决这个问题。
elementBefore :: Eq a => a -> [a] -> Maybe a
elementBefore elt (x : xs@(y : _)) | y == elt = Just x
| otherwise = elementBefore elt xs
elementBefore _ _ = Nothing
关键是使用@
制作" as-pattern",同时命名列表xs
的尾部(如果我们不幸运,请使用并将其匹配为(y : _)
(所以我们可以看到我们是否已经赢了)。
当我还是个孩子的时候,我父亲和我会写这样的东西
elementBefore elt (_ ++ x : elt : _) = Just x
elementBefore _ _ = Nothing
但这对于有效的Haskell来说太简单了。