Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
Haskell 单子结合律中的未绑定变量_Haskell_Closures_Monads_Associativity - Fatal编程技术网

Haskell 单子结合律中的未绑定变量

Haskell 单子结合律中的未绑定变量,haskell,closures,monads,associativity,Haskell,Closures,Monads,Associativity,使用ghci,我计算了: Prelude> let m = [1,2] Prelude> let ys = [4, 5, 6] Prelude> m >>= (\x -> ys >>= (\y -> return (x, y))) [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6)] 上面的一元表达式似乎与一元结合定律的任何一边都不对应: (m >>= f) >>= g ≡ m >>

使用ghci,我计算了:

Prelude> let m = [1,2]
Prelude> let ys = [4, 5, 6]
Prelude> m >>= (\x -> ys >>= (\y -> return (x, y)))
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6)]
上面的一元表达式似乎与一元结合定律的任何一边都不对应:

(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
test2 = let m = [1,2]
            ys = [4, 5, 6]
        in (m >>= \x -> liftM ((,) x) ys) >>= (\(x, y) -> return (x, y))
我想知道如何将monad关联性应用于表达式:

m >>= (\x -> ys >>= (\y -> return (x, y))) 
import Control.Monad (liftM)

test = let m = [1,2]
           ys = [4, 5, 6]
       in m >>= (\x -> ys >>= (\y -> return (x, y)))

因为返回x,y在周围函数和包含它的函数上都是闭合的,所以在本例中,存在于关联性定律m>>=f左侧的中间单子似乎不可能存在。

实际上,不可能直接应用关联性定律,因为原始表达式中的x的范围:

m >>= (\x -> ys >>= (\y -> return (x, y))) 
import Control.Monad (liftM)

test = let m = [1,2]
           ys = [4, 5, 6]
       in m >>= (\x -> ys >>= (\y -> return (x, y)))
然而,如果我们将x包含在第一个一元计算的结果中,我们可以缩小x的范围。我们将使用\x->liftM,x ys并返回[Int,Int],而不是在x->ys中返回[Int],其中每对中的第一个数字始终是x,第二个是ys中的一个。请注意,对于列表,liftM与map相同。第二个函数将从其输入读取x的值:

test1 = let m = [1,2]
            ys = [4, 5, 6]
        in m >>= (\x -> liftM ((,) x) ys >>= (\(x', y) -> return (x', y)))
一元函数\x',y->return x',y现在可以简化为return,随后>>=return被完全删除,但为了参数的缘故,我们还是保留它吧

现在,每个一元函数都是自包含的,我们可以应用结合性定律:

(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
test2 = let m = [1,2]
            ys = [4, 5, 6]
        in (m >>= \x -> liftM ((,) x) ys) >>= (\(x, y) -> return (x, y))

实际上,由于原始表达式中x的范围,不可能直接应用结合定律:

m >>= (\x -> ys >>= (\y -> return (x, y))) 
import Control.Monad (liftM)

test = let m = [1,2]
           ys = [4, 5, 6]
       in m >>= (\x -> ys >>= (\y -> return (x, y)))
然而,如果我们将x包含在第一个一元计算的结果中,我们可以缩小x的范围。我们将使用\x->liftM,x ys并返回[Int,Int],而不是在x->ys中返回[Int],其中每对中的第一个数字始终是x,第二个是ys中的一个。请注意,对于列表,liftM与map相同。第二个函数将从其输入读取x的值:

test1 = let m = [1,2]
            ys = [4, 5, 6]
        in m >>= (\x -> liftM ((,) x) ys >>= (\(x', y) -> return (x', y)))
一元函数\x',y->return x',y现在可以简化为return,随后>>=return被完全删除,但为了参数的缘故,我们还是保留它吧

现在,每个一元函数都是自包含的,我们可以应用结合性定律:

(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
test2 = let m = [1,2]
            ys = [4, 5, 6]
        in (m >>= \x -> liftM ((,) x) ys) >>= (\(x, y) -> return (x, y))

我认为你混淆了一元表达式结构的一元法则。一元结合律规定,表达式m>>=f>>=g必须等价于表达式m>>=\x->f x>>=g,才能将m的数据类型视为一元

这并不意味着每个一元表达式的形式都必须是m>>=f>>=g

例如,m>>=f是一个完全有效的一元表达式,即使它的形式不是m>>=f>>=g。然而,它仍然遵循一元结合律,因为m可以从一元权利身份律m>>=return扩展为m>>=return≡ M因此:

在您的示例中,m>>=\x->ys>=\y->return x,y的形式为m>=f,其中f为\x->ys>=\y->return x,y

虽然从一元结合律的右侧看,y不是形式为\x->fx>>=g的,但并不意味着它违反了一元结合律

表达式m>=\x->ys>=\y->return x,y可以通过用m>>=return替换m来扩展为一元关联形式:


希望这能澄清问题。

我认为你混淆了一元表达式结构的一元法则。一元结合律规定,表达式m>>=f>>=g必须等价于表达式m>>=\x->f x>>=g,才能将m的数据类型视为一元

这并不意味着每个一元表达式的形式都必须是m>>=f>>=g

例如,m>>=f是一个完全有效的一元表达式,即使它的形式不是m>>=f>>=g。然而,它仍然遵循一元结合律,因为m可以从一元权利身份律m>>=return扩展为m>>=return≡ M因此:

在您的示例中,m>>=\x->ys>=\y->return x,y的形式为m>=f,其中f为\x->ys>=\y->return x,y

虽然从一元结合律的右侧看,y不是形式为\x->fx>>=g的,但并不意味着它违反了一元结合律

表达式m>=\x->ys>=\y->return x,y可以通过用m>>=return替换m来扩展为一元关联形式:


希望这能澄清问题。

一元法则只适用于一个参数的函数。表情

xs >>= (\x -> ys >>= (\y -> (x, y)))
实际上相当于:

xs >>= \x -> fmap ($ x) $ ys >>= \y -> return (\x -> (x,y))
如果我们要避免捕获x

所以你不能应用相同的定律-我们有fmap作为f,没有结合定律中的g

以上内容当然与以下内容相同:

xs >>= \x -> fmap ($ x) $ fmap (\y x -> (x,y)) ys


一元律只适用于一个参数的函数。表情

xs >>= (\x -> ys >>= (\y -> (x, y)))
实际上相当于:

xs >>= \x -> fmap ($ x) $ ys >>= \y -> return (\x -> (x,y))
如果我们要避免捕获x

所以你不能应用相同的定律-我们有fmap作为f,没有结合定律中的g

以上内容当然与以下内容相同:

xs >>= \x -> fmap ($ x) $ fmap (\y x -> (x,y)) ys

我看不太对
函数中关联性定律的手侧。ys没有使用绑定的x,也就是说,你的函数不是一元标准形式。@我认为这可以归结为:\x->x是一个函数,但是\x->x,y不是。例如,[1,2]0 0 0 0 0 0 0,2 0 0 0 0 0 0,y-20]给出[21,-19,22,-18,22,-18,22,-18,22,-18,22,-18,18,18,18,-18,18,18,18,-18,22,-18,22,-18,22,-18,22,-18,22,-18,22,-18,18,-18,18,18,18,18,18,18,18,18,23,--17,-17,-17,[17]给出[21]给出[21,[21,[21,[19,22,[19,22,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20]>>=\y->[x+y+20,y-20]引发了一个错误我不太明白函数中关联性定律的右侧。ys没有使用绑定的x,也就是说,你的函数不是一元标准形式。@我认为这可以归结为:\x->x是一个函数,但是\x->x,y不是。例如,[1,2]0 0 0 0 0 0 0,2 0 0 0 0 0 0,y-20]给出[21,-19,22,-18,22,-18,22,-18,22,-18,22,-18,18,18,18,-18,18,18,18,-18,22,-18,22,-18,22,-18,22,-18,22,-18,22,-18,18,-18,18,18,18,18,18,18,18,18,23,--17,-17,-17,[17]给出[21]给出[21,[21,[21,[19,22,[19,22,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20,[20]>>=\y->[x+y+20,y-20]引发一个错误当m>>=f形式的每个一元表达式都可以简单地展开为m>>=return>>=f时,为什么要使用liftM将其提升为关联一元定律形式-m>>=f>>=g?考虑liftM展开为什么很重要。当m>>=f形式的每个一元表达式都可以简单地展开时,为什么要使用liftM扩展到m>>=返回>>=f将其提升到关联一元律形式-m>>=f>>=g?考虑liftM扩展到的内容很重要。