這裏有一個免費的點對點版
import Control.Category (>>>)
import Data.Maybe (catMaybes)
skips =
pred >>> -- \n -> n-1
(`replicate` const Nothing) >>> -- \n -> [ const Nothing, ..., const Nothing ] -- length n -1
(Just:) >>> -- \n -> [ Just, const Nothing, ... const Nothing ] -- length n
cycle >>> -- \n -> [ Just, const Nothing, ... const Nothing, Just, const Nothing, ... ] -- infinite length
zipWith ($) >>> -- \n [ a0, a1, .., aN, aNPlus1, ... ] -> [ Just a0, Nothing, ..., Just aN, Nothing, ... ]
(catMaybes .) -- \n [ a0, a1, .., aN, aNPlus1, ... ] -> [a0, aN, a2N, ...]
正如其他人所說,這樣的事情將是更容易理解 與貼題的定義。
我使用>>>
(又名flip (.)
)的唯一原因是您可以更輕鬆地按照文檔進行操作。一個等價的定義是:
skips = (catMaybes .) . zipWith ($) . cycle . (Just:) . (`replicate` const Nothing) . pred
兩個自由點名堂這是很好的凸顯:
(`replicate` const Nothing)
相當於(flip replicate (const Nothing))
或(\n -> replicate n (const Nothing))
(catMaybes .) . f
相當於\n -> catMaybes . f n
或\n xs -> catMaybes (f n xs)
如果您不能導入catMaybes
,您可以通過其自由點清晰度concatMap (maybe [] return)
E放置它,使無進口定義:
skips = (concatMap (maybe [] return) .) . zipWith ($) . cycle . (Just:) . (`replicate` const Nothing) . pred
可以簡化爲
skips = (concat.) . zipWith ($) . cycle . (return:) . (`replicate` const []) . pred
你爲什麼需要? Pointfree功能很有趣,但很少能成爲解決您的問題的更好解決方案。此外,與Haskell可以做的相比,這個實現相當複雜。 – bheklilr
只是大學的任務來實現測試的功能(我實現它的參數,但應該是PointFree – Spamua3
@ Spamu3這個實現將是非常困難的免費,我會建議使用更多的功能從'前奏曲'首先工作。這將更容易使點免費 – bheklilr