因此,我试图了解单子,函子和应用程序。我创建了以下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 = ...
之所以不起作用,是因为(+)
将两个数字相加,而不是三个。