关于应用程序的多个参数不起作用?

问题描述 投票:1回答:1

因此,我试图了解单子,函子和应用程序。我创建了以下Maybe的重命名镜像匹配,称为Sometimes。 (我这样做是为了了解这些事情)

data Sometimes a = Nope | Thing a deriving Show

instance Monad Sometimes where
    (Thing x) >>= f = f x
    Nope  >>= f = Nope
    return      = Thing

instance Applicative Sometimes where
      pure = Thing
      Nope <*> _ = Nope
      (Thing g) <*> mx = fmap g mx

instance Functor Sometimes where
     fmap _ Nope = Nope
     fmap g (Thing x) = Thing (g x)

因此,当我执行以下操作时,它会起作用:

pure (1+) <*> (Thing 1)
> Thing 2

pure (+) <*> (Thing 1) <*> (Thing 1)
> Thing 2

但是,如果我尝试添加三个,将无法正常工作:

pure (+) <*> (Thing 1) <*> (pure 1) <*> (pure 1)

<interactive>:108:1: error:
    • Non type-variable argument in the constraint: Num (a -> b)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a b. (Num (a -> b), Num a) => Sometimes b

为什么这不起作用?我希望前两个应用,然后第三个应用到前两个的结果。我的书谈论fmap0, fmap1, fmap2...的执行效率低下,因此

...对于具有任意数量参数的函数,可以根据具有以下类型的两个基本函数来构造:pure :: a -> f a(<*>) :: f (a -> b) -> f a -> f b

并进一步说明:

pure<*>的典型用法具有以下形式:

pure g <*> x1 <*> x2 <*> ... <*> xn

因此,我期望它能正常工作,但是我在Applicative的定义/用法中显然缺少某些内容。


我正在使用Graham Hutton写的《 Haskell SE中的编程》这本书>

因此,我试图了解单子,函子和应用程序。我创建了以下名为Maybe的重命名镜像匹配,有时称为。 (我这样做是为了了解这些事情)数据有时a = ...

haskell monads applicative
1个回答
2
投票

之所以不起作用,是因为(+)将两个数字相加,而不是三个。

© www.soinside.com 2019 - 2024. All rights reserved.