小编Sav*_*emp的帖子

如何将 Haskell 中的 fold 函数与其他数据类型一起使用

关于如何为新数据类型创建折叠函数有一种通用的思考方式吗?

例如,数据树的折叠函数是:

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 fold algebraic-data-types

5
推荐指数
0
解决办法
333
查看次数

地图map vs map.map

我是Haskell的新手,我认为Haskell中的功能map mapmap.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 functional-programming function

4
推荐指数
1
解决办法
106
查看次数

如何在Haskell中了解嵌套Lambda函数

我试图了解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的新手,所以我对这些类型的转换不是很自信。如果不正确,什么是正确的转换?

haskell functional-programming

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