我制作了这两个haskell函数,
cut :: Int -> [a] -> (Error ([a],[a]))
cut _ [] = Ok([],[])
cut n xs | n>0 && n < length xs = Ok(take n xs, drop n xs)
| n > length xs = error("Fail")
mix :: [a] -> [a] -> [a]
mix xs [] = xs
mix [] ys = ys
mix (x:xs) (y:ys) = x:y:mix xs ys
现在希望制作一个我可以同时使用这两者的功能,
这就是我所拥有的;
doboth :: [Int] -> [a] -> Error [a]
doboth (x:xs) list = mix((cut x list)) then send xs back to doboth recursivly for the next x elemet of the list.
这个功能的想法是剪切一个列表,然后混合两个列表,它从两个整体列表中获取切割点...
任何想法?
答案 0 :(得分:0)
由于cut不返回列表,因此需要进行模式匹配:
case cut x list of
Ok (as, bs) -> mix ... ... -- and so forth
答案 1 :(得分:0)
不应该返回错误[[a]]?
也许您应该使用像Maybe或Either这样的标准类型而不是错误。
如果我理解你想要什么,那么doboth就像是
doboth xs list = mapM (\ x -> mix (cut x list)) xs
假设你已经将错误变成了monad(可能和已经存在)。
答案 2 :(得分:0)
您必须自问几个问题:
cut
是否必须返回Error
值?或者你能否提出一个适用于所有输入的合理定义。例如,tail
不适用于所有输入,而take
则适用。调查take
并查看它如何处理特殊输入。这可能会让您更好地定义cut
。这一点很重要的原因是,为所有值返回统一结果的函数通常更容易使用。
如果doboth
的结果出错,您希望cut
做什么?
doboth
是否独立地对列表的元素进行操作?或者结果是否依赖于早期的计算?第一个是map
,第二个是fold
。您想为cut
输入中的每个值执行mix
和[Int]
,但是cut
的输入应该是原始列表,还是上一步中的列表
鉴于您已经计算了doboth
的一个步骤,doboth
的下一步应该是什么样的?尝试写出可以同时执行两个甚至三个doboth
步骤的代码。
如果doboth
参数为空,[Int]
的值是多少?