2014-08-15 4 views
0

как взять элемент elt и список xs и возвращает только элемент перед первым вхождением elt в xs, если он существует. например,Как вернуть элемент до ввода?

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

Охранники должны находиться на новой линии, и вам не хватает равных после «иначе». Код, похоже, работает, но вы получаете неожиданные результаты? –

+0

Возможный дубликат [Haskell, передающий пустой символ в функцию] (http://stackoverflow.com/questions/25271939/haskell-passing-empty-character-to-a-function) – amalloy

ответ

3

Это хорошо прослеживается в комментариях, что ваш otherwise (это просто синоним True) нужен = знак, как и любой другой охранник, но я хотел бы сделать несколько других настроек.

Частичные функции head и tail, вероятно, лучше избегают, тем более, что есть хороший способ решить эту проблему с помощью сопоставления с образцом.

elementBefore :: Eq a => a -> [a] -> Maybe a 
elementBefore elt (x : [email protected](y : _)) | y == elt = Just x 
            | otherwise = elementBefore elt xs 
elementBefore _ _ = Nothing 

Ключ является использование @, чтобы сделать «как образец», одновременно называя хвост списка xs (для использования, если не повезет) и соответствие его как (y : _) (так что мы можем видеть если мы выиграли).

Когда я был ребенком, мой отец и я бы написал что-то вроде этого

elementBefore elt (_ ++ x : elt : _) = Just x 
elementBefore _ _ = Nothing 

но это всегда было слишком просто, чтобы быть действительным Haskell.

+0

Он работает хорошо, спасибо! – Kris

Смежные вопросы