这是一个不适合我的功能,我想我需要摆脱fst.
flagHolidays :: [(C.Day,Availability)] -> Handler [(C.Day,Availability)]
flagHolidays dayPairs = do
let days = map fst dayPairs
yepNope = Prelude.map isHoliday days
availability = Prelude.map flagAvailability yepNope
return $ Prelude.zip days availability
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是进行非常难看的模式匹配(x,y):(xs,ys).删除是否fst有意义?如果是这样,那么对这个对列表进行模式匹配的最佳方法是什么?
Dav*_*ani 22
原因head,tail并init没有在惯用的haskell代码中使用它们不是全部函数 - 一些输入导致错误发生.将空列表传递给任何这些函数会导致空列表异常.
fst并且snd没有这个问题,因为没有输入可以传递给那些会导致异常的函数.所以没有理由试图避免这些功能.
你的函数可以更好地编写(其他注释提供了很好的细节),但它不是由于使用fst或snd.
aug*_*tss 14
使功能纯净
flagHolidays = map (second $ flagAvailability . isHoliday)
Run Code Online (Sandbox Code Playgroud)
并回答实际问题,除非作为参数传递fst和snd很少使用.
[编辑]嗯,我写得有点草率.这是不对的.你传递了一对配对,从不使用该对的第二个组成部分.更正,但同样(现在使用fst):
flagHolidays = map ((id &&& flagAvailability . isHoliday) . fst)
Run Code Online (Sandbox Code Playgroud)