gpt4 book ai didi

haskell - Haskell 中谓词集上的 `fmap` 是什么意思?

转载 作者:行者123 更新时间:2023-12-04 05:11:30 27 4
gpt4 key购买 nike

我正在为 Haskell 编程做的学生作业包括一个我有点困惑要解决的任务。事情是这样给出的:只为基于集合的新类型创建一个 Functor 类的实例。有一个声明:

newtype Set x = Set { contains :: (x -> Bool) }

这是我理解 if fmap 意味着什么的案例用于诸如一组谓词之类的东西。在做之前的任务时,我已经定义了 fmap而不是像 (+3) 这样的函数(改变整数), (toUpper) (到字符串)等。这是我第一次处理超出正常类型(各种数字、字符串、字符)的任何内容。我谦虚地尝试开始:
instance Functor Set where
fmap f (Set x) = if (contains x) == True then Set (f x) else Set x

当然,这是一个废话代码,但我想一些真/假需要在 fmap 之前进行评估申请顺利。但是,首先,请您解释一下谓​​词集的问题以阐述更明智的方法吗?

最佳答案

有了这个定义,实际上是不可能定义一个Functor Set 的实例.造成这种情况的原因是您的 Set a类型包含 a处于负数位置...即 a是函数的参数,而不是值。发生这种情况时,类型构造函数可以是逆变仿函数(来自 Contravariant 包的类型类 contravariant),但它不能是协变仿函数(Functor 类型类)。

以下是这些类的定义:

class Functor f where
fmap :: (a -> b) -> f a -> f b

class Contravariant f where
contramap :: (a -> b) -> f b -> f a

看到不同?在逆变仿函数中,当您传入的函数被提升以对仿函数类型进行操作时,它的方向会发生翻转。

最后,这应该是有道理的。您对“集合”的概念是一种测试,它告诉您某物是否符合条件。这是集合的完美数学定义,但它为您提供了与标准不同的计算能力。例如,您无法获取基于谓词的集合的元素;只等待被赋予一个潜在的元素。如果您有 Set Integer , 和一个函数 f :: String -> Integer ,然后你可以测试 String s 首先将它们转换为 Integer s 并测试它们,因此您可以从 Set Integer 获得至 Set String .但是有一个 g :: Integer -> String不让你测试 Strings !

如果这是一个作业,那么要么您误解了该作业,要么您之前做了一些与预期不同的步骤(例如,如果您在前面的部分中自己定义了 Set,也许您需要更改定义),或者也许您的老师希望您能为此而挣扎并理解原因 Functor无法定义。

关于haskell - Haskell 中谓词集上的 `fmap` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581603/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com