Function 如何从Haskell中带参数的函数中提取?
我知道在一个Function 如何从Haskell中带参数的函数中提取?,function,haskell,higher-order-functions,do-notation,Function,Haskell,Higher Order Functions,Do Notation,我知道在一个do块中,我可以从一元的东西中提取内容。例如,如果我有一个带有签名的函数: myFunction::MyReader(Set Int) 我可以在do块中执行此操作: mySet MyReader(Set Int) 我不能再做我想做的事了: myFunction'设置Int。我想不出或找不到任何地方可以做我想做的事。有人能帮忙吗?这样可以: result <- myFunction x 可以理解为 run command1, store the result in va
do
块中,我可以从一元的东西中提取内容。例如,如果我有一个带有签名的函数:
myFunction::MyReader(Set Int)
我可以在do
块中执行此操作:
mySet MyReader(Set Int)
我不能再做我想做的事了:
myFunction'设置Int
。我想不出或找不到任何地方可以做我想做的事。有人能帮忙吗?这样可以:
result <- myFunction x
可以理解为
run command1, store the result in var1
then
run command2 using var1 as a parameter, store the result in var2
警告
有许多单子的这种类比将被打破,并且完全错误,但在早期,这几乎是初学者在一段时间内看到的唯一模式。这可能是您正在寻找的:(未经测试) 然后:
something = do
...
myFunction' <- flipReader myFunction
做某事
...
我的函数“你认为我的函数是什么?”没有函数
(Monad m)=>(a->mb)->m(a->b)
。这实质上意味着将一元函数转化为纯函数。@NiklasB。-你有没有参考过证明不存在这样的函数的证据?顺便说一句,我几乎可以肯定你所说的是真的,但仅仅基于我脑海中一些挥手的东西,我希望看到一些更正式的东西。事实证明,用谷歌搜索也有点困难……如果你的Monad m
也是Distributive m
(例如你的阅读器),那么你可以使用distribute::(a->mb)->m(a->b)
@jamshidh作为证明,假设它在任何Monad中都是可能的,因此即使在延续Monad中也是如此。然后,推导一个(a->(b->r)->r)->(a->b)->r)->r类型的术语。选择r=a
并释放第一个输入。然后推导出((a->b)->a)->a
。应用柯里·霍华德,推导皮尔斯定律。矛盾与此相同的技巧对我来说失败了,因为x
不在范围内。这就是为什么我试着把它添加到两边。我想如果我理解了你们试图解决的更大的问题,这会更容易理解。你能在上面给出一句关于你试图解决的更广泛问题的话吗?好吧,你已经编辑了你的答案,但它仍然没有给出我想要的。为了清楚起见,我希望左侧是类型为Int->Set Int
的函数。在这种情况下,不需要。我不想找到解决问题的方法。如果答案是Haskell不允许我对MyReader(Set Int)
toMyReader(Int->Set Int)
使用高阶函数,那将是一个更好的答案。我不确定类型系统是否允许这样做。快速搜索(A->mb)->m(A->b)
什么也找不到。flipReader
是从数据中分发的特例。分发的
。好吧,你说得对,我认为它很难看。但它确实回答了我的问题!谢谢
data MyEnv = MyEnv { myFn :: Int -> Set Int }
type MyReader a = Reader MyEnv a
myFunction :: Int -> MyReader (Set Int)
something = do
...
myFunction' <- reader (\env x -> runReader (myFunction x) env)
-- here myFunction' :: Int -> Set Int
flipReader :: (a -> Reader b c) -> Reader b (a -> c)
flipReader r = reader (\y x -> runReader (r x) y)
something = do
...
myFunction' <- flipReader myFunction