编写haskell函数的正确方法是什么

时间:2014-03-23 08:48:51

标签: haskell

我对练习感到有些困惑。 exercice要求一个函数,它将从列表中取出最后一个元素,并将此代码显示为正确的答案。

    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'

第一个解决方案中的所有额外代码是什么?

1 个答案:

答案 0 :(得分:5)

示例代码显示了实现myButLast的5种不同方式。请注意,myButLastmyButLast'功能完全不同。

关于你的答案 - 你的直觉是正确的,但你的功能只处理一个输入 - [1,2,3,4]。相反,您可以传递任何列表:

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

合并它们并添加类型签名:

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

哪种无点样式与第一种解决方案相同:

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