Haskell 哈斯凯尔的左舵相同,右舵不同
我需要解决的问题是: 使用foldMap为可折叠类型编写筛选函数 对于以下所有测试,函数应返回Haskell 哈斯凯尔的左舵相同,右舵不同,haskell,Haskell,我需要解决的问题是: 使用foldMap为可折叠类型编写筛选函数 对于以下所有测试,函数应返回True: 根据老师给我们的提示,我写了这个解决方案: filterF :: ( Applicative f , Foldable t , Monoid (f a) ) => (a-> Bool) -> t a -> f a filterF funct u= foldMap (\x -> if funct x t
True
:
根据老师给我们的提示,我写了这个解决方案:
filterF
:: ( Applicative f
, Foldable t
, Monoid (f a)
)
=> (a-> Bool) -> t a -> f a
filterF funct u= foldMap (\x -> if funct x then pure x else mempty) u
请注意,我显然不完全理解这个解决方案,因为我不明白为什么这些测试返回True
。我的理解是:
接收两个参数:filterF
(一个接受funct
类型的参数并返回Bool的函数)和a
(一个可折叠的幺半群)u
- 我们让
决定funct
中的每个元素是否应该保留。如果它真的存在,我们就用u
纯
- 然后,我们使用
monoidal状态定义的操作将所有元素合并为一个元素f
f
的结构。有点像我们在中国的做法:
unit_testFilterF6=filterF Data.Char.isUpper"aNA aRe mEre" :: First Char
有人能进一步解释一下这是怎么回事吗?我是Haskell初学者。让我们为
编写f
(\x>如果funct x那么pure x else mempty)
,当funct
是Data.Char.isUpper
时
我们可以对Data.Char.isUpper“aNA仅仅”的过滤器进行评估,如下所示:
filterF Data.Char.isUpper "aNA aRe mEre"
= -- definition of filterF
folMap f "aNA aRe mEre"
= -- definition of foldMap
f 'a' <> f 'N' <> f 'A' <> f ' ' <> f 'a' <> f 'R' <> ....
= -- definition of f
mempty <> pure 'N' <> pure 'A' <> mempty <> mempty <> pure 'R' <> ...
= -- monoidal laws
pure 'N' <> pure 'A' <> pure 'R' <> pure 'E'
filterF Data.Char.isUpper“aNA是纯粹的”
=--过滤器的定义f
folMap f“安娜只是一个孩子”
=--foldMap的定义
f'a'f'N'f'a'f'f'f'R'。。。。
=--f的定义
记忆纯的N纯的A纯的记忆纯的R。。。
=--单倍体定律
纯N纯A纯R纯E
从这里,使用您提到的几个幺半群中的
的定义,您应该能够得出结论
unit_testFilterF6=filterF Data.Char.isUpper"aNA aRe mEre" :: First Char
filterF Data.Char.isUpper "aNA aRe mEre"
= -- definition of filterF
folMap f "aNA aRe mEre"
= -- definition of foldMap
f 'a' <> f 'N' <> f 'A' <> f ' ' <> f 'a' <> f 'R' <> ....
= -- definition of f
mempty <> pure 'N' <> pure 'A' <> mempty <> mempty <> pure 'R' <> ...
= -- monoidal laws
pure 'N' <> pure 'A' <> pure 'R' <> pure 'E'