我寫了一個函數,它將函數列表應用於一個項目。在Haskell中應用函數列表
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
有沒有更好的方法來做到這一點?
我寫了一個函數,它將函數列表應用於一個項目。在Haskell中應用函數列表
applyAll :: [a -> b] -> a -> [b]
applyAll [] _ = []
applyAll (f:fs) x = (f x) : (applyAll fs x)
有沒有更好的方法來做到這一點?
你可以使用:
applyAll l v = fmap ($ v) l
fmap
在輸入列表(實際上任何函子)提升的功能。 $
的類型爲(a -> b) -> a -> b
,因此它將函數應用於給定值。 ($ v)
是section,它將給定的函數應用於v
。
李的解決辦法是什麼我建議,但這種讀取甚至更好:
import Control.Applicative
applyAll' fs v = fs <*> pure v
或
applyAll'' fs v = fs <*> [v]
這類品牌的東西比需要更復雜,雖然:我們真的只需要列表的Functor
實例,而applyAll'
會注入並立即從Applicative
實例中提取。
這種特殊的等價性確實幫助我在幾個月前考慮過某些事情。 – dfeuer 2015-02-09 04:59:03
這個函數實際上已經存在的一元函數的一個特例:
applyAll :: [a -> b] -> a -> [b]
applyAll = sequence
當這樣豈不更好了明確的遞歸方法嗎?它更優雅,更簡潔,更通用,可能更易於優化,可以在任何地方進行特定內聯定義... – leftaroundabout 2015-02-09 00:02:56