小编Sni*_*per的帖子

递归如何满足基本情况Haskell

我试图理解这段代码,该代码返回[a]传递给它的所有可能的组合:

-- Infinite list of all combinations for a given value domain
allCombinations :: [a] -> [[a]]
allCombinations []     = [[]]
allCombinations values = [] : concatMap (\w -> map (:w) values)
                                        (allCombinations values)
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试了此示例输入:

ghci> take 7 (allCombinations [True,False])
[[],[True],[False],[True,True],[False,True],[True,False],[False,False]]
Run Code Online (Sandbox Code Playgroud)

在我看来,递归最终将如何停止并返回是无法理解的[ [ ] ],因为allCombinations函数当然没有任何指针在列表中移动,每次调用以及在遇到基本情况时[ ]都会返回[ [ ] ]。据我说,它将调用allCombinations函数无限,并且永远不会停止。还是我想念什么?

另一方面,在执行完所有计算之后,在递归调用完成之后返回,仅在执行所有计算后,take仅返回第一个7元素final list。那么实际上递归如何满足这里的基本情况?

其次concatMap,这里的目的是什么,在这里我们还可以使用Mapfunction来将函数应用于列表,而在内部函数中我们可以排列列表?实际concatMap在这里做什么。从定义来看,它concatMap告诉我们它首先映射了函数,然后将列表连接起来,正如我所看到的,我们已经在函数内部进行了此操作?

任何宝贵的意见将不胜感激?

recursion haskell list

8
推荐指数
1
解决办法
193
查看次数

在Haskell中从左到右对树中所有发生的叶子进行编号

函数类型是Tree a - > Tree(a,Int).我想把数字从树中拿出来并相应地对每个出现的叶子进行编号.

到目前为止,我试过这个:

labelTree :: Tree a -> Tree (a, Int)
labelTree (Leaf a) = Leaf (a,1)
labelTree (tr)     = labelTree' (tr) 0

labelTree' :: Tree a -> Int -> (Tree (a,Int))
labelTree' (Leaf a) n   = Leaf (a,(n+1))
labelTree' (Node l r) n = (labelTree' (r) (snd (labelTree' (l) n)))
Run Code Online (Sandbox Code Playgroud)

问题是我不知道为什么它给了我这个表达式的类型错误: labelTree' (Node l r) n = (labelTree' (r) (snd (labelTree' (l) n)))

请说明我出错的地方!

binary haskell

6
推荐指数
3
解决办法
214
查看次数

Haskell中的算术表达式评估

在这里,我试图使用Exp数据类型的定义值来评估Haskell中的表达式.函数类型是eval :: Exp -> Int,数据类型是这样的:

data Exp = Num Int
       | Exp :+: Exp
       | Exp :-: Exp
       | Exp :*: Exp
       | Exp :/: Exp
       deriving (Show)
Run Code Online (Sandbox Code Playgroud)

和我想要评估的价值是这些:

 4 + 5 * 6 , respecting correct precedences of the operators
 4 + 5 + 6 , respecting, that + binds left-associative
 (4 + 3) * (5 - 2)
 4 + (4 / (2 - 2))
Run Code Online (Sandbox Code Playgroud)

到目前为止,这个逻辑工作得很好,这是:

eval :: Exp -> Int
eval (Num a) = …
Run Code Online (Sandbox Code Playgroud)

evaluation haskell operators operator-precedence

2
推荐指数
2
解决办法
189
查看次数