2014-03-23 3 views
0

Я немного смущен упражнением. Упражнение попросило функцию, которая будет принимать последний, но один элемент из списка, и показывает этот код как правильный ответ.Каков правильный способ записи функции haskell

myButLast :: [a] -> a 
    myButLast = last . init 

    myButLast' x = reverse x !! 1 

    myButLast'' [x,_] = x 
    myButLast'' (_:xs) = myButLast'' xs 

    myButLast''' (x:(_:[])) = x 
    myButLast''' (_:xs) = myButLast''' xs 

    myButLast'''' = head . tail . reverse 

Но я только что сделал это, и он просто работал спросил

myButLast' = init[1,2,3,4] 
    myButLast'' = last myButLast' 

Что все, что дополнительный код в первом растворе?

ответ

5

В примере кода показаны 5 различных способов реализации myButLast. Обратите внимание, что myButLast и myButLast' являются совершенно разными функциями.

О вашем ответе - ваша интуиция верна, но ваша функция касается только одного входа - [1,2,3,4]. Вместо этого, вы можете передать любой список:

myButLast' xs = init xs 
myButLast'' = last myButLast' 

Объедините их и добавить подпись типа:

myButLast :: [a] -> a 
myButLast xs = last $ init $ xs 

Что в стиле pointfree равно первое решение:

myButLast :: [a] -> a 
myButLast = last . init 
Смежные вопросы