很难理解折叠...扩展是否正确?也会欣赏任何会使折叠更容易消化的链接或类比.
foldMap :: (a -> b) -> [a] -> [b]
foldMap f [] = []
foldMap f xs = foldr (\x ys -> (f x) : ys) [] xs
b = (\x ys -> (f x):ys)
foldMap (*2) [1,2,3]
= b 1 (b 2 (foldr b [] 3))
= b 1 (b 2 (b 3 ( b [] [])))
= b 1 (b 2 ((*2 3) : []))
= b 1 ((*2 2) : (6 :[]))
= (* 2 1) …Run Code Online (Sandbox Code Playgroud) 我不理解Map.map(Data.Map中的map函数)和Map.fromList的签名.功能本身就在签名中.我也不确定为什么在我想要实现Map.member或Map.filter或Map.size等其他函数时总是调用Map.fromList.就像为什么我不能直接在列表中应用函数,而是必须通过Map.fromList间接应用它.
最后但并非最不重要的...... fromList'的签名.我注意到被调用的Map.Map函数有一个大写M而不是小m,它是关闭的(参考第二行的Map.map)为什么会这样?
非常感谢
Map.fromList :: Ord k => [(k, a)] -> Map.Map k a
Map.map :: (a -> b) -> Map.Map k a -> Map.Map k b
fromList' :: (Ord a) => [(a,b)] -> Map.Map a b
fromList' = foldl (\acc (a,b) -> Map.insert a b acc) Map.empty
Run Code Online (Sandbox Code Playgroud) 我正在努力使用树定义地图foldBT.我的想法是将树转换为列表,将运算符映射到列表,然后将列表转换回树.但它听起来效率低,也没有利用foldBT...我试图运行,foldBT (*2) Nil (numTree [3,5,7]但ghci报告错误.我真的不明白这个功能foldBt是如何运作的.一个例子就是很棒.
data SimpleBT a = Nil | N a (SimpleBT a) (SimpleBT a) deriving (Show, Eq)
foldBT :: (a -> b -> b -> b) -> b -> SimpleBT a -> b
foldBT f e Nil = e
foldBT f e (N a left right) = f a (foldBT f e left) (foldBT f e right)
mapTree :: (a -> b) -> SimpleBT a -> SimpleBT b
mapTree …Run Code Online (Sandbox Code Playgroud) 正在阅读为了一个伟大的好事学习你一个哈斯克尔!理解实例和善意都有很大的麻烦.
Q1:那类型t中Tofu t,与那种签名功能的行为(* -> (* -> *)) -> *?而整体的签名tofu是* -> *,不是吗?因为(* -> *) -> *结果*等等(* -> (* -> *)) -> *
Q2:当我们想要创建Frank a b类型类的实例时Tofu t,数据类型Frank a b也必须具有相同的类型t.这意味着某种a是*,b是* -> *,以及哪种结果b a会(* -> *) -> *产生*.那是对的吗?
Q3:xin tofu x代表j a因为两者都有 …
haskell ×4
fold ×2
binary-tree ×1
currying ×1
dictionary ×1
map-function ×1
type-kinds ×1
typeclass ×1