我正在测试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穷举?
答案 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