Has*_*bit 3 haskell functional-programming functor
我正在为 Haskell 编程做的学生作业包括一个我有点困惑要解决的任务。事情是这样给出的:只为基于集合的新类型创建一个 Functor 类的实例。有一个声明:
newtype Set x = Set { contains :: (x -> Bool) }
Run Code Online (Sandbox Code Playgroud)
这是我理解 iffmap应用于诸如一组谓词之类的东西的意义的一个案例。在处理以前的任务时,我已经定义fmap了(+3)(更改整数)、(toUpper)(字符串)等函数。这是我第一次处理超出正常类型(各种数字、字符串、字符)的任何内容。我谦虚地尝试开始:
instance Functor Set where
fmap f (Set x) = if (contains x) == True then Set (f x) else Set x
Run Code Online (Sandbox Code Playgroud)
当然,这是一个无意义的代码,但我想在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
Run Code Online (Sandbox Code Playgroud)
看到不同?在逆变函子中,当你传入的函数被提升以对函子类型进行操作时,它的方向被翻转。
最后,这应该是有道理的。您对“集合”的概念是一种测试,它告诉您某物是否符合条件。这是一个集合的完美数学定义,但它为您提供了与标准不同的计算能力。例如,您无法获取基于谓词的集合的元素;只等待被赋予一个潜在的元素。如果您有一个Set Integer, 和一个函数f :: String -> Integer,那么您可以String通过首先将它们转换为Integers 并测试它们来测试 s ,这样您就可以从 Set Integer to 获得Set String。但是有一个g :: Integer -> String不会让你测试Strings!
如果这是一个作业,那么要么你误解了作业,你做了一些与预期不同的早期步骤(例如,如果你Set在前面的部分定义了自己,也许你需要改变定义),或者你的导师希望你会为此而挣扎并理解为什么Functor无法定义。
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |