Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯凯尔的左舵相同,右舵不同_Haskell - Fatal编程技术网

Haskell 哈斯凯尔的左舵相同,右舵不同

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

我需要解决的问题是:

使用foldMap为可折叠类型编写筛选函数

对于以下所有测试,函数应返回
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
    (一个接受
    a
    类型的参数并返回Bool的函数)和
    u
    (一个可折叠的幺半群)
  • 我们让
    funct
    决定
    u
    中的每个元素是否应该保留。如果它真的存在,我们就用
  • 然后,我们使用
    f
    monoidal状态定义的操作将所有元素合并为一个元素
考虑到在测试中我们有相同的LHS和不同的RH,我想RHS会影响
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'