关于如何为新数据类型创建折叠函数有一种通用的思考方式吗?
例如,数据树的折叠函数是:
data Tree t = Leaf | Node t (Tree t) (Tree t)
deriving (Eq,Ord,Show)
treeFold:: (a -> b -> b -> b) -> b -> Tree a -> b
treeFold f e Leaf = e
treeFold f e (Node x l r) = f x (treeFold f e l) (treeFold f e r)
Run Code Online (Sandbox Code Playgroud)
例如,我必须如何为以下数据创建折叠函数?
data Json a = Val a | Obj [(String, Json a)]
Run Code Online (Sandbox Code Playgroud)
我知道该类型必须包含 2 个函数,Val 和 Obj 各一个。创建折叠时我必须考虑什么?我希望我的问题是有道理的。我刚刚遇到了许多不同的数据类型,其中要求为数据类型编写折叠函数,但我似乎没有找到模式。
我是Haskell的新手,我认为Haskell中的功能map map和map.map相同。我的终端机给我两种不同的类型,
(map.map) :: (a -> b) -> [[a]] -> [[b]]
Run Code Online (Sandbox Code Playgroud)
和
(map map) :: [a -> b] -> [[a] -> [b]]
Run Code Online (Sandbox Code Playgroud)
这些功能在语法方面有什么不同?每个功能的确切含义是什么?
我试图了解Haskell中以下2个lambda表达式的含义:
f = \x -> x (\y -> x y)
g = \x -> (\y -> y) x
Run Code Online (Sandbox Code Playgroud)
我试图将它们转换,然后得到了:
f x y = x x y
g x y = y x
Run Code Online (Sandbox Code Playgroud)
它是否正确?我假设两个函数的参数都必须是x和y,因为它们都可以在函数描述的lambda表达式中找到。我基本上是这样理解的:f(x)= xf(y)和f(y)= y x。对于g,g(x)= g(y)x和g(y)= y。但是,由于我是Haskell的新手,所以我对这些类型的转换不是很自信。如果不正确,什么是正确的转换?