我试图实现这个函数
every :: (a -> IO Bool) -> [a] -> IO Bool
这是这个问题的主题。我尝试在没有显式递归的情况下完成此操作,我得出了以下代码:
every f xs = liftM (all id) $ sequence $ map f xs
我的函数没有工作,因为它不是惰性的(这在问题中是必需的),所以没有点赞 :-)。
然而,我并没有止步于此。我试图使函数成为无参数的,这样它会更短(也许更酷)。由于参数f
和xs
是表达式中的最后一个,所以我只需删除它们:
every = liftM (all id) $ sequence $ map
但是这并没有像预期的那样工作,实际上根本不起作用:
[1 of 1] Compiling Main (stk.hs,解释)
stk.hs:53:42: 无法匹配预期类型“ [ma]” 对抗推断类型`(a1-> b) - > [a1] -> [b]' 在“ $”的第二个参数中,也就是“映射”的第二个参数中 在表达式中:“ liftM(all id)$ sequence $ map” 失败,模块已加载:none。
为什么会这样?我原本以为可以简单地删除尾随函数参数,这基本上就是柯里化的内容。