: -- This works: foldr go1 [] [1..]
-- This doesn't: foldr go2 [] [1..]
go1 a b = a : b
go2 a [] = a : []
go2 a b = a : b
與go1摺疊馬上開始返回值,但go2似乎等待列表的末尾。 很明顯,模式匹配導致某些東西被不同地處理。有人可以解釋這裏究竟發生了什麼嗎?
如何編寫一個函數,該函數使用ai -> b -> ai類型的函數的元組並返回一個函數,該函數使用元素類型爲ai的元組的元素,並將每個元素組合爲b元素進入ai一個新的元組的: 即簽名應該像 f :: (a1 -> b -> a1, a2 -> b -> a2, ... , an -> b -> an) ->
(a1, a2, ... , an) ->
b ->
(a1,
我們可以看到,我們可以使用reduce/foldl1作爲函數by which we can define other higher order functions such as map, filter and reverse。 (defn mapl [f coll]
(reduce (fn [r x] (conj r (f x)))
[] coll))
(defn f
由於採用摺疊功能轉換二進制樹列表: type 'a tree = Empty | Node of 'a * 'a tree * 'a tree
用途: let rec tree_fold f e t = match t with
| Empty -> e
| Node (x, l, r) -> f x (tree_fold f e l) (tree_fold f e r);;
一個二叉
我最近開始使用vim進行摺疊。遺憾的是沒有的情況下非常有用,我宣佈我的功能是這樣的: /**
* A function that do something.
* @param a A
* @param b B
* @return Something
*
**/
int i_do_something(int a, int b) {
something();
}
在我的夢
在解釋foldr哈斯克爾新手,規範的定義是 foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
但在GHC.Base,foldr被定義爲 foldr k z = go
where
go [] = z
go
實現對於列表中的一個函數映射到每個第n個元素的功能: mapEvery :: Int -> (a -> a) -> [a] -> [a]
mapEvery n f = zipWith ($) (drop 1 . cycle . take n $ f : repeat id)
是否有可能與foldr像普通map來實現這一點? 編輯:在標題中,將'文件夾'更改爲'foldr'。自動更正...
在此博客條目,"CSP and transducers in JavaScript",筆者指出: 首先,我們必須認識到,許多陣列(或其他集合),如map,filter和reverse操作可以在一個reduce來定義。 我的問題是:如何能像地圖,過濾器和相反的操作可以在一個減少來定義?你能提供Clojure的例子嗎?