我相信这是非常明显的,但忍耐我,我是新来的这个东西,它不是点击。 所以我和其他许多人一样,一直试图让我的头在Monads身边。我已经到了适合>> =和返回操作员等等的地步。但我觉得我不会真正理解它,直到我落后它并自己写作。按类型指定函数参数
因此,我一直在试图实现List >>的bind >> =操作符作为map和foldr的组合。例如,[5,6,7,8] >>= (\x -> [x*5, x*6, x*7])
产生[25,30,35,30,36,42,35,42,49,40,48,56]
。这看起来很像地图和折叠的组合。但是,如果我尝试类似foldr (++) [] . map
的东西,我会得到一个明显的类型错误,即地图没有按照预期的类型[a] -> [[a]]
。当然,如果我使用诸如map (\x -> [x*5, x*6, x*7])
之类的东西作为合成操作符的正确参数,它都可以工作。
但是,每次指定一个特定的函数会很麻烦;不知何故,>> =运算符以更一般的方式运行。有没有办法通过它的类型指定参数?像,我可以不知何故告诉地图在这个组合中只采用a -> [a]
类型的函数吗?我是否需要编写一个类型为(a -> [a]) -> [a] -> [[a]]
的函数,因为没有办法将地图函数缩小为我想要的函数类型?
另外,请随时告诉我,我接近这一切都是错误的。我对这种类型的东西仍然很陌生。如果是这样,请指出我正确的方向。
该死的,哈斯克尔聪明;比我更聪明。这很奇怪。谢谢,答案接受。这太棒了。 – 2014-10-08 03:10:20