lambda 表达式中的应用仿函数,非穷尽模式?

Applicative functors within lambda expressions, non-exhaustive patterns?

我正在测试 lambda 函数中的应用函子,但我坚持使用我编写的以下代码。 'myAddition'需要取'Random a'的累计:

我很高兴有更好的方法来执行以下操作,但是我正在学习仿函数,所以这是相关的

data Random a = Nill | Random a deriving (Show, Ord, Eq)

randomOrNot = [Nill, Random 22, Random 101, Nill, Random 44]

instance Functor Random where
  fmap f (Nill) = Nill
  fmap f (Random a) = Random (f a)

instance Applicative Random where
  pure a = Random a
  (<*>) (Random a) = fmap a

cumulativeTotal :: [Random a] -> Random a
cumulativeTotal li = foldr (\el acc -> (pure (+) <*> el) <*> acc) (Random 0) li

main = do
  print $ cumulativeTotal randomOrNot

错误:

"Non-exhaustive patterns in function <*>"

我明白错误的含义,但是我不确定如何使应用函子 lambda 详尽无遗?

这是解决此问题的一种方法:

 instance Applicative Random where
     pure a = Random a
     (Random f) <*> (Random a) = Random (f a)
     _ <*> _ = Nill

首先,引入格式f (a -> b) <*> f a)并将第一种情况的结果定义为Random (f a)。然后,通过将结果设置为 Nill 来处理输入为 Nill 的情况,而不管 f (a -> b)f a 项。这将解决 Random 构造函数的所有可能值并解决您的非详尽模式问题。

或者,您可以选择像这样进一步分解案例,结果相同:

instance Applicative Random where
    pure a = Random a
    (Random f) <*> (Random a) = Random (f a)
    _ <*> Nill = Nill
    Nill <*> (Random a) = Nill

Demo