這是編寫自己的代碼 - 你只需要加入類型。但有幾個標準工具(即Applicative
和Traversable
),您可以使用它們縮短代碼。
在Data.Traversable
模塊壽命sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
。當專門到Traversable
[]
的實例和功能應用性(->) r
我們得到:
sequenceA :: [r -> a] -> r -> [a]
所以sequenceA
洋基->
出[]
,將各功能列表中的一個固定的說法。
sequenceA [(< 7), (> 7), (== 7)] :: (Num n, Ord n) => n -> [Bool]
-- equivalent to:
\n -> map ($ n) [(< 7), (> 7), (== 7)]
所以你的第一個功能,可我使用and
代替mconcat . map (All .)
寫成
f :: (Num n, Ord n) => n -> Bool
f = and . sequenceA [(< 7), (> 7), (== 7)]
。
對於第二個功能,uncurry
是正確的工具。我們必須將uncurry
映射到二進制函數列表上以獲取元組的一元函數列表,以便我們可以使用sequenceA
提升單個參數。因爲traverse f = sequenceA . map f
我們可以把它寫成:
g :: Ord n => n -> n -> Bool
g = curry $ and . traverse uncurry [(<), (>), (==)]
(NB,爲Ord
,>
和<
任何正確實施的實例應該是相互排斥所以這兩個函數總是返回False
。)