【问题标题】:Recursive functions in HaskellHaskell 中的递归函数
【发布时间】:2018-10-25 19:11:08
【问题描述】:

我有一个以 n-1 方式拆分列表的函数。拆分后,我想以递归方式对拆分的每个项目执行操作。我无法弄清楚如何进行这种递归,因为我是 Haskel 的新手并且无法理解如何在 Haskell 中使用值

recur(list)= do [splitAt n list | n <- [1..((length list)-1)]]
                print say each first element of split( say [1,2] it should print [1] )
                recur(second element of list)

我想知道如何使用 split 的输出并继续下一步,因为 Haskell 我们不能使用变量声明并使用该变量。

【问题讨论】:

  • 那么,你想在splitAt的输出上映射一个函数?
  • 好的。首先,do 表示法与单子有关。一般来说,它并不是设计为haskell 的命令式接口。所以作为一个建议,在你学会如何思考功能之前忘记它的存在。您的问题可以使用来自Data.List 库的函数map 和inits 来解决。试一试,解决不了就回来
  • 到目前为止你尝试过什么?你以前在列表上写过递归函数吗?在哈斯克尔?如果没有,您编写的哪些 Haskell 代码可能是一个起点? (列表上的非递归函数?使用case的函数?Int上的函数?)

标签: haskell


【解决方案1】:

首先编写一个关于你想对单个列表做什么的函数。为简单起见,我假设您想要字符串格式的列表的第一个元素。但这可以是任何功能。

getFirstElement :: [a] -> String
getFirstEement [] = ""
getFirstElement (x:xs) = show x 

现在您想在列表列表上运行它并将它们组合起来。您可以为它编写另一个函数。这将做的是获取所有列表的第一个元素并将它们组合起来

combineList :: [[a]] -> String
combineList [] = ""
combineList (x:xs) = getFirstElement x ++ <any separator if needed> ++ combineList xs

以上是使用非常基本的递归和模式匹配。 combinelist 的最后一行也可以使用 fold 函数编写。

进一步说明,有一种称为“Applicative Functors”的东西,其存在的目的是“序列计算并组合它们的结果”。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2011-02-14
    • 2019-02-28
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多