使用错误处理程序的Haskell splitAt函数

使用错误处理程序的Haskell splitAt函数,haskell,Haskell,我试图在Haskell中编写一个函数,在第n个元素之后的点将列表拆分为两个 到目前为止,我有以下代码: data Err e = Bad|Good e splitAt:: Int -> [a] -> Err(([a],[a])) splitAt 0 zs = Good(([], zs)) splitAt n _ = Bad 我不确定如何将错误消息应用于以下情况: splitAt n (z:zs) | n > 0 = (z:zs', zs'') where (zs', zs'

我试图在Haskell中编写一个函数,在第n个元素之后的点将列表拆分为两个

到目前为止,我有以下代码:

data Err e = Bad|Good e

splitAt:: Int -> [a] -> Err(([a],[a]))
splitAt 0 zs = Good(([], zs))
splitAt n _ = Bad
我不确定如何将错误消息应用于以下情况:

splitAt n (z:zs) | n > 0 = (z:zs', zs'') where (zs', zs'') = split (n-1) zs
如果数字大于列表长度或数字为负数,则函数还应返回错误消息“Bad”。例如

splitAt 6 [1,2,3,] = Bad
splitAt (-3) [1,2,3] = Bad

如果您有任何建议,我将不胜感激。

这就是我将如何实施的方法。函子实例是为了方便避免类似于
case。。。在
splitAt
函数中的
,并将与
可能
完全相同。由于您的
splitAt
版本可以返回不同的值,因此您不能简单地使用您发布的
where
修改示例,因为将模式匹配修改为
Good(zs',zs')=…
将在返回
Bad
时引发异常,反之亦然

  data Err e = Bad|Good e deriving (Eq, Show)

  instance Functor Err where
    fmap _ Bad      = Bad
    fmap f (Good a) = Good (f a)

  splitAt' 0 zs = Good ([],zs)
  splitAt' n [] = Bad
  splitAt' n (z:zs) 
    | n > 0     = fmap (\(zs',zs'') -> (z:zs',zs'')) (splitAt' (n-1) zs)
    | otherwise = Bad

我希望这有帮助。请随时询问是否有不清楚的地方。

为什么要使用
Err
?这就是
可能是为了,如果你使用它,你有一个完整的库来帮助你。我是Haskell的新手,希望练习使用多态类型SOH,好的。只需知道你的错误类型是Haskell的最低版本。在“实数代码”中,选择使用Maybe。当n为负数且n大于数组长度时,您希望返回一个错误,对吗?所以你可以考虑这些案例