运用我的功能?

时间:2011-03-26 15:40:50

标签: haskell

我制作了这两个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. 

这个功能的想法是剪切一个列表,然后混合两个列表,它从两个整体列表中获取切割点...

任何想法?

3 个答案:

答案 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]的值是多少?