gpt4 book ai didi

haskell - 函数式解题: how to use Haskell?

转载 作者:行者123 更新时间:2023-12-02 07:01:12 25 4
gpt4 key购买 nike

我正在尝试解决 H99 中的问题之一:将列表分成两部分;给出第一部分的长度。

不要使用任何预定义的谓词。

例子:

> (split '(a b c d e f g h i k) 3)
( (A B C) (D E F G H I K))

我可以很快找到解决方案:

split'::[a]->Int->Int->[a]->[[a]]
split' [] _ _ _ = []
split' (x:xs) y z w = if y == z then [w,xs] else split' xs y (z+1) (w++[x])

split::[a]->Int->[[a]]
split x y = split' x y 0 []

我的问题是,我正在做的只是以递归格式重写循环版本。这是你在 Haskell 中做事的正确方式吗?不就是和命令式编程一样吗?

编辑:此外,您通常如何避免此处的额外功能?

最佳答案

您经常可以将命令式解决方案转换为 Haskell,这很方便,但您是对的,您通常确实希望找到更自然的递归语句。特别是对于这个,根据基本案例和归纳案例进行推理可能非常有帮助。那么你的基本情况是什么?为什么,当分割位置为0时:

split x 0 = ([], x)

可以通过将列表的第一个元素添加到用 n-1 拆分的结果上来构建归纳案例:

split (x:xs) n = (x:left, right)
where (left, right) = split xs (n-1)

这可能不会很好地执行(它可能没有你想象的那么糟糕)但它说明了我第一次遇到问题并想从功能上解决它时的思考过程。

编辑:另一个更依赖 Prelude 的解决方案可能是:

split l n = (take n l, drop n l)

关于haskell - 函数式解题: how to use Haskell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20505582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com