我有这样的类型:
data Move a t = Emove a a
| Move a t a
我想让它成为一个函子
instance Functor Move where
fmap f (Emove x y) = Emove (f x) (f y)
fmap f (Move x c y) = Move (f x) c (f y)
但是,由于这类类型的错误,这并不能编译。有人能帮我解决这个问题吗?如何向此实例提供t类型?
我读了一个,上面写着:
为许多标准类型类函子提供实例将立即为您提供许多实际免费的功能。
我的问题是:您免费获得的这个功能(函子或其他类型类)是什么?我知道函子的定义是什么,但是通过将函数定义为函子/其他类型类,可以得到什么是空闲。不是更漂亮的语法。理想情况下,这是对函子/其他类型类进行操作的通用和有用的函数。
我的想象(可能是错误的)自由意味着什么是这样的功能:TypeClass x => useful x y = ..
==编辑/加法==
我想我主要问的是那些更抽象(而且令人难以置信的)类型的类,比如中的类。对于Ord这样不那么抽象的类,我面向对象的直觉可以理解。
我一直在考虑如何为以下类型实现等效的unfold:
data Tree a = Node (Tree a) (Tree a) | Leaf a | Nil
这并不明显,因为列表的标准unfold返回一个值和下一个种子。对于这种数据类型,这是没有意义的,因为在到达叶节点之前没有“值”。这样,返回新种子或以价值停止才是真正有意义的。我使用的定义是:
data Drive s a = Stop | Unit a | Branch s s deriving Show
unfold :: (t -> Drive t a) -> t -> Tree a
unfold fn x = ca
我混淆了Ocaml中的模块类型。
我想知道在什么情况下应该使用模块类型?
我通常在.mli中使用模块sig来公开一些细节,并在.ml中添加相应的实现模块结构。
例如:
.mli
module A:
sig
type t = T of string
end
.ml
module A =
struct
type t = T of string
end
因此,我认为Ocaml的模块类似于C中的.h和.c文件。
我知道模块类型可以声明一个接口,但是接口是,而不是。
就像书中的一个例子:
open Core.Std
module type ID = sig
type t
假设F是一个具有附加律的应用函子(具有Haskell语法):
pure (const ()) <*> m === pure ()
pure (\a b -> (a, b)) <*> m <*> n === pure (\a b -> (b, a)) <*> n <*> m
pure (\a b -> (a, b)) <*> m <*> m === pure (\a -> (a, a)) <*> m
如果我们省略(3.),这个结构叫什么?
我在哪里可以找到更
在使用GHC代码库时,我发现了一个名为的类型。
class HasDynFlags m where
getDynFlags :: m DynFlags
虽然类型化名称看起来是不言自明的,但我在类型化定义中找不到其他约束,即m必须是Monad,或者至少是Functor,这样我们才能访问该值。
但是,我在代码库中发现的大多数代码都是在do-表示法中使用的,例如dynFlag <- getDynFlags,其中m被进一步限制为Monad的一个实例。
我的问题是:
对于HasDynFlags m来说,m至少必须是Functor才能使这个类型有用吗?
如果第一个问题的答案是否定的,
我是OCaml的完全初学者,但我经常看到类似于以下介绍性示例的代码
let sum = List.fold ~f:(+.) ~init:0.0
在这个片段中,困扰我的是List.fold的明确使用。在我所知道的大多数语言中,容器的显式类型将通过使用接口、特征或类型来抽象,这样就可以重用这些代码来对数组或任何其他顺序容器进行求和。
有什么OCaml方法可以使这更通用呢?
我有一个函数声明如下;它的确切工作与此无关。
template<typename T>
std::pair<int, int>
partition3(T *pT, const int N, const T &Kq, const int w,
std::function<int(const T&, const T&, int)> P);
在呼叫站点,我尝试执行以下操作:
bool partition3_test()
{
struct cmp
{
int operator()(int x, int y
我有这样一个场景:
#include <algorithm>
using namespace std;
// a "heavy" struct with lots of members
struct B {
int key;
// other members
}
class A {
vector<B> bs;
}
我想按它们的钥匙分类。现在,为了避免交换B(因为它们相当重),我过去这样做的一种方法是定义索引向量并对索引进行排序。如果bs不是类成员,则此操作有效。
例如:
vector<B> bs;
vector<s
我正在尝试从运行以下组合器
trait AddlCombinators[F[_]] extends Monad[F[_]] {
def forever[A, B](a: F[A]): F[B] = {
lazy val t: F[B] = forever(a)
a flatMap (_ => t)
}
}
但这并不是在汇编:
[error] AddlCombinators.scala:7: value flatMap is not a member of type
parameter F[A]
[error] a flatMap (_ =&g