这个适用法则是什么意思?

Tim*_*Tim 0 haskell applicative

声明为

class   Functor f   =>  Applicative f   where
pure    ::  a   ->  f   a
(<*>)   ::  f   (a  ->  b)  ->  f   a   ->  f   b
Run Code Online (Sandbox Code Playgroud)

适用法律之一是:

x <*> y <*> z = ( pure (.) <*> x <*> y) <*> z
Run Code Online (Sandbox Code Playgroud)

(.)函数之间的组成在哪里 :

(.) ::  (b  ->  c)  ->  (a  ->  b)  ->  (a  ->  c)
f   .   g   =   \x  ->  f   (g  x)
Run Code Online (Sandbox Code Playgroud)

在法律的右边,

  • 确实pure (.)有型f((b -> c) -> (a -> b) -> (a -> c))
  • 确实x有型f(b->c)
  • 确实y有型f(a->b)
  • 确实z有型f(a)

在法律的左侧,

  • 确实x有型f(a->b->c)
  • 确实y有型f(a)
  • 确实z有型f(b)

谢谢。

lef*_*out 6

适用法律在等效单曲面仿函数表示中更容易理解:

class Functor f => Monoidal f where
  pureUnit :: f ()
  fzip :: f a -> f b -> f (a,b)
--pure x = fmap (const x) pureUnit
--fs<*>xs = fmap (\(f,x)->f x) $ fzip fs xs
--pureUnit = pure ()
--fzip l r = (,) <$> l <*> r
Run Code Online (Sandbox Code Playgroud)

然后,您要询问的法律是这样的:

fzip x (fzip y z) ? fzip (fzip x y) z
Run Code Online (Sandbox Code Playgroud)

p ? q我的意思是,当量为元组类型的重新关联,即明确

fzip x (fzip y z) ? fmap (\((a,b),c)->(a,(b,c))) $ fzip (fzip x y) z
Run Code Online (Sandbox Code Playgroud)

因此,这实际上只是一个关联法则。使用infix编写时,甚至更清晰可见(?) = fzip

x ? (y ? z) ? (x ? y) ? z
Run Code Online (Sandbox Code Playgroud)