Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何从Haskell中带参数的函数中提取?_Function_Haskell_Higher Order Functions_Do Notation - Fatal编程技术网

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)
to
MyReader(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