Haskell 函数safetail中的非穷举模式

Haskell 函数safetail中的非穷举模式,haskell,Haskell,我的代码有什么问题 safetail (x:xs)= if null []==True then xs else error "Empty" 当我运行代码时,它会显示一个异常: 您需要使用两个案例;模式匹配甚至阻止在空列表上成功调用函数 safetail [] = error "Empty" safetail (_:xs) = xs 也就是说,一个名为safe的函数引发运行时异常具有一定的讽刺意味。或者返回一个空列表 safetail :: [a] -> [a] safetail

我的代码有什么问题

safetail (x:xs)= if null []==True then  xs else  error "Empty"
当我运行代码时,它会显示一个异常:


您需要使用两个案例;模式匹配甚至阻止在空列表上成功调用函数

safetail [] = error "Empty"
safetail (_:xs) = xs
也就是说,一个名为safe的函数引发运行时异常具有一定的讽刺意味。或者返回一个空列表

safetail :: [a] -> [a]
safetail [] = []
safetail (_:xs) = xs
或者更改您的函数类型,使其为总计。例如:

safetail :: [a] -> Maybe [a]
safetail [] = Nothing
safetail (_:xs) = Just xs

模式x:xs将第一个元素分配给x,cons列表的尾部分配给xs。当列表为空时,它将不匹配,因为没有第一个元素。null[]始终为真,因为空列表是空列表。好的,但是当我运行此代码时没有问题,我想在运行此代码时告诉我列表为空safetail[],而不是告诉我为空,显示异常为什么?谢谢你,我的兄弟,谢谢你的帮助,非常有用
safetail :: [a] -> Maybe [a]
safetail [] = Nothing
safetail (_:xs) = Just xs