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
我正在测试 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