【发布时间】:2014-11-01 10:04:52
【问题描述】:
我知道在do 块内我可以从一元的东西中提取,“提取”它的内容。例如,如果我有一个带有签名的函数:
myFunction :: MyReader (Set Int)
我可以在 do 块内执行此操作:
mySet <- myFunction
这会给我想要的Set Int。但是,如果我改变我的函数,让它接受一个参数:
myFunction :: Int -> MyReader (Set Int)
我不能再做我想做的事了:
myFunction' <- myFunction
编译失败,出现错误Couldn't match expected type 和Probable cause: ‘myFunction'’ is applied to too few arguments。尝试这样的事情甚至在语法上都不正确:
myFunction' x <- myFunction x
我确实希望 myFunction' 的类型为 Int -> Set Int。我无法弄清楚或找到任何地方如何做我想做的事。有人可以帮忙吗?
【问题讨论】:
-
您认为
myFunction' <- myFunction会做什么?基本上这仅在 MyReader monad 上下文中才有意义,但myFunction'不是一个函数。也许您的意思是mySet <- myFunction和类似的mySet <- myFunctionWithAParameter 1? -
不可能存在函数
(Monad m) => (a -> m b) -> m (a -> b)。这实质上意味着将一元函数转换为纯函数。 -
@NiklasB.- 你有没有参考证明不存在这样的功能?顺便说一句,我几乎可以肯定你说的是真的,但只是基于我脑海中一些挥之不去的东西,我希望看到更正式的东西。事实证明,谷歌搜索有点困难......
-
如果您的
Monad m也是Distributive m(例如您的阅读器),那么您可以使用distribute :: (a -> m b) -> m (a -> b) -
@jamshidh 作为证明,假设它在任何单子中都是可能的,因此即使在延续单子中也是如此。然后,推导出一个
(a -> (b -> r) -> r) -> ((a -> b) -> r) -> r类型的术语。选择r=a并释放第一个输入。然后推断((a -> b) -> a) -> a。应用 Curry-Howard 并推导出皮尔斯定律。矛盾。与stackoverflow.com/questions/24141972/…中相同的技巧
标签: function haskell higher-order-functions do-notation