(( - >)t)在Haskell中意味着什么?

drt*_*drt 15 haskell functional-programming

在Haskell中,(( - >)t)在实例的类型签名中意味着什么?例如,Functor,Applicative和Monad都有一个实例:

Functor ((->) r)
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于这种类型签名的含义的解释,并且它具有高度的搜索引擎抗性.

npo*_*cop 19

->是一个中缀类型的构造函数.您可以将它与:- 列表类型的中缀值构造函数进行比较.为了:单独使用,我们在它周围加上括号,使它成为前缀函数应用程序:

(:) a b 是相同的 a : b

同样,与to 的函数类型(->) a b相同.a -> bab

(->) a是类型构造函数的部分应用程序,它本身就是一种类型的构造函数* -> *.

你可以把它想象成"一个函数类型的构造函数".Eg (->) Int是一个函数类型的构造函数Int.你可以通过另一种类型是构建全功能型:(->) Int String是函数的类型从IntString.

instance Functor (->) a是一个函数,具有fmapa -> b函数转换为a -> c函数的操作.您可以通过将参数应用于值来将其与instance Functor (Either a)映射Either a b到的类似物进行比较.Either a cfmapRight

  • 在我看来,`( - >)r`实例非常难以理解.我对很多Haskell感到相对自信,但我对`( - >)r`实例的工作方式仍然毫无直觉.我可以*使用*他们,因为我一直使用它们,所以对我来说不再是非常奇怪.只是我不会说我深深理解他们.不要担心,如果你不这样做.我相信它会及时传到我们这两个人身上. (8认同)

wit*_*wit 10

我们可以使用lambda函数和中缀函数:

(->) a    =    \b ->  (->) a b  --pseudo-Haskell
(->) a    =    \b ->  a -> b    --pseudo-Haskell
Run Code Online (Sandbox Code Playgroud)

所以,读取实例为:

class Functor f where
   fmap :: (a->b) -> f a -> f b

instance Functor ((->)r) where
   fmap :: (a->b) -> f     a  -> f     b
         = (a->b) -> (->)r a  -> (->)r b   --pseudo-Haskell
         = (a->b) -> (r -> a) -> (r -> b)  --pseudo-Haskell
Run Code Online (Sandbox Code Playgroud)