我输入之前如何返回元素?

时间:2014-08-15 06:23:41

标签: haskell

如何获取元素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) 

1 个答案:

答案 0 :(得分:3)

在评论中充分发现,otherwise(这只是True的同义词)需要=标志,就像任何其他警卫一样,但我做了其他一些调整。

可能更好地避免部分函数headtail,特别是因为有一种很好的方法可以通过模式匹配来解决这个问题。

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来说太简单了。