lambda表达式中的应用函子,非详尽模式?

时间:2016-10-10 09:07:57

标签: haskell lambda applicative

我正在测试lambda函数中的applicative functor,但我仍然坚持使用下面编写的代码。 ' myAddition'需要累计'随机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穷举?

1 个答案:

答案 0 :(得分:3)

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

 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