我试图理解这段代码,该代码返回[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告诉我们它首先映射了函数,然后将列表连接起来,正如我所看到的,我们已经在函数内部进行了此操作?
任何宝贵的意见将不胜感激?
函数类型是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)))
请说明我出错的地方!
在这里,我试图使用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)