我正在尝试创建一个生成列表中最后一项的函数.我想用反向和!! 这是我到目前为止:
myLast :: [a] -> [a] -> Int -> a
myLast xs = (reverse xs) !! 1
Run Code Online (Sandbox Code Playgroud)
我知道问题出在该类型的某个地方,但我无法确定如何修复它.
函数的类型签名与您在函数中使用的内容无关,它只描述了其他人如何使用您正在定义的函数.所以通过写作
myLast :: [a] -> [a] -> Int -> a
Run Code Online (Sandbox Code Playgroud)
你说,用户需要提供两个列表和整数.只是为了得到其中一个列表的最后一个元素?这没有意义.
你的意思是肯定的
myLast :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
在考虑如何实现该功能之前,通常应该写下来.
使用该签名,您可以编写各种实现:
myLast :: [a] -> a
myLast xs = head $ reverse xs
myLast' :: [a] -> a
myLast' [l] = l
myLast' (_:xs) = myLast' xs
myLast'' :: [a] -> a
myLast'' = fix $ \f (x:xs) -> maybe x id . teaspoon $ f xs
Run Code Online (Sandbox Code Playgroud)
或者你选择的任何奇怪的实现,它与签名无关.
在一个不相关的注意事项:虽然last实际上是从前奏的标准功能,它是一种功能在现代哈斯克尔避免:last []给出了一个错误,因为是没有a的空单被发现的价值!错误很糟糕.因此,写它的"理想"方式实际上就是这样
myLast :: [a] -> Maybe a
myLast [] = Nothing
myLast [x] = x
myLast (_:xs) = myLast xs
Run Code Online (Sandbox Code Playgroud)