简体   繁体   English

Haskell中不同数据类型的函数

[英]Functions of different Data Types in Haskell

I have the DataType我有数据类型

data Rose a = Leaf a | Node [Rose a]

an example would be:一个例子是:

fmfp = Node [Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"]

which graphically looks like this:在图形上看起来像这样: 在此处输入图片说明

I have learned how to (mechanically) write fold functions for different data types, and so I came up with this fold function:我已经学会了如何(机械地)为不同的数据类型编写折叠函数,所以我想出了这个折叠函数:

foldRose :: (a -> r) -> ([r] -> r) -> Rose a -> r

foldRose fl fn Leaf a = fl a
foldRose fl fn Node a = fn (map (foldRose fl fn)) a

The thing is, I don't really understand WHAT it does.问题是,我真的不明白它的作用。 For example, if I had例如,如果我有

foldRose id concat fmfp 

what would it do exactly?它会做什么? Would it be可不可能是

foldRose id concat fmfp = concat [concat [id "F"], concat [], 
                                  concat [id "F", id "P"], id "M"]

How do you wrap your mind around those kinds of functions?你如何围绕这些功能? What do they intuitively mean?它们的直观含义是什么? Also, how do I write a mapRose function, what would I have to think befre starting, what would it be supposed to do?另外,我如何编写 mapRose 函数,在开始之前我会怎么想,它应该做什么?

Just follow the steps, slowly and confidently.只需按照步骤,缓慢而自信地进行。

data Rose a = Leaf a | Node [Rose a]

fmfp = Node [ Node [Leaf "F"]
            , Node []
            , Node [Leaf "F", Leaf "P"]
            , Leaf "M" ]

foldRose :: 
         (a -> r)               -> 
               ([r] -> r)        -> 
                     Rose a       ->  r
foldRose fLeaf fNode (Leaf a    )  =  fLeaf a
foldRose fLeaf fNode (Node trees)  =  fNode (map (foldRose fLeaf fNode) trees)

( " r " is for recursive result ). r用于递归结果)。

Notice that you had few errors there, which I fixed in the above.请注意,您在那里几乎没有错误,我在上面修复了这些错误。 Now,现在,

  foldRose id concat fmfp 
= let fLeaf = id
      fNode = concat
  in
  foldRose fLeaf fNode (Node [Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"])
= fNode (map (foldRose fLeaf fNode) 
                             [Node [Leaf "F"], Node [], Node [Leaf "F", Leaf "P"], Leaf "M"])
= fNode [
          foldRose fLeaf fNode $ Node [Leaf "F"]
        , foldRose fLeaf fNode $ Node []
        , foldRose fLeaf fNode $ Node [Leaf "F", Leaf "P"]
        , foldRose fLeaf fNode $ Leaf "M" ]
= fNode [
          fNode $ map (foldRose fLeaf fNode) [Leaf "F"]
        , fNode $ map (foldRose fLeaf fNode) []
        , fNode $ map (foldRose fLeaf fNode) [Leaf "F", Leaf "P"]
        , fLeaf $ "M" ]
= fNode [
          fNode [ foldRose fLeaf fNode $ Leaf "F"]
        , fNode []
        , fNode [ foldRose fLeaf fNode $ Leaf "F", foldRose fLeaf fNode $ Leaf "P"]
        , fLeaf "M" ]
= fNode [
          fNode [ fLeaf "F"]
        , fNode []
        , fNode [ fLeaf "F", fLeaf "P"]
        , fLeaf "M" ]

and that is simply这只是

= concat [ concat [ id "F"]
         , concat []
         , concat [ id "F", id "P"]
         , id "M"
         ]
= concat [ concat [ "F"], [], concat [ "F", "P"], "M" ]
= concat [          "F",               "FP",      "M" ]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM