我对haskell很新,需要针对我正在处理的问题使用特定的数据类型。
etRaportGreutate
所以,当我创建一个例如Node [Leaf 1,Leaf2,Leaf 3]的实例时,如何访问这些?它不会让我使用头部或尾部或索引!!
答案 0 :(得分:4)
您执行模式匹配。例如,如果您想要第一个孩子,可以使用:
firstChild :: Tree a -> Maybe (Tree a)
firstChild (Node (h:_)) = Just h
firstChild _ = Nothing
我们在此处将答案包装在Maybe
类型中,因为我们可以处理Leaf x
或Node []
,以便没有第一个孩子。
或者我们可以例如使用
获取 i 项iThChild :: Int -> Tree a -> Tree a
iThChild i (Node cs) = cs !! i
所以我们在这里打开Node
构造函数,获取子项列表cs
,然后执行cs !! i
以获取 i -th子项。但请注意,(!!) :: [a] -> Int -> a
通常是一种反模式:它不安全,因为我们无法保证列表包含足够的元素,并且使用length
也是一种反模式,因为列表可以有无限长度,所以我们不能做这样的绑定检查。
通常,如果在Haskell中编写算法,则会倾向于使用线性访问,并编写 total 函数:总是返回某些函数的函数。