让我们看看 Haskell 中用于处理反向列表的新数据类型的声明:
import Data.Monoid
data RevList a = Nil | RCons (RevList a) a deriving (Eq, Show)
instance Monoid a => Monoid (RevList a) where
mempty = Nil
instance Semigroup a => Monoid (RevList a) where
Nil <> RCons (RevList a) a = RCons (RevList a) a
RCons (RevList a) a <> RNil = RCons (RevList a) a
Nil <> Nil = Nil
Run Code Online (Sandbox Code Playgroud)
我困扰的问题是编译失败,其描述如下:
`<>' is not a (visible) method of class `Monoid'
Run Code Online (Sandbox Code Playgroud)
首先,我尝试在没有任何 Semigroup 实例声明的情况下创建一个 Monoid 实例,但是在阅读此问题 …
我正在为 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应用程序顺利之前需要评估一些真/假。但是,首先,请您解释一下谓词集的问题以阐述更明智的方法吗?