小编Jac*_*tte的帖子

在课堂和唱片之间进行选择

基本问题:在选择使用类或使用记录(具有多态字段)时,应该遵循哪些设计原则?

首先,我们知道类和记录本质上是等价的(因为在Core中,类被去掉了字典,这只是记录).然而,存在差异:类是隐式传递的,记录必须是显式的.

更深入一点,在以下情况下,课程非常有用:

  1. 我们对"同一件事" 有许多不同的表述,并且
  2. 在实际使用中,可以推断使用哪种表示.

当我们(仅参数多态)只有一个数据表示时,类很尴尬,但我们有多个实例.如果我们不想打开各种麻烦的扩展(即,我们知道这些标记在运行时被删除),这导致了必须使用newtype添加额外标记(仅存在于我们的代码中,因为我们知道此类标记在运行时被删除)的语法噪音(即重叠和/或不可判定的实例).

当然,事情变得更加混乱:如果我想对我的类型有限制怎么办?让我们选一个真实的例子:

class (Bounded i, Enum i) => Partition a i where
    index :: a -> i
Run Code Online (Sandbox Code Playgroud)

我可以很容易地完成

data Partition a i = Partition { index :: a -> i}
Run Code Online (Sandbox Code Playgroud)

但现在我已经失去了约束,我将不得不将它们添加到特定的功能中.

是否有设计指南可以帮助我?

haskell record typeclass

33
推荐指数
1
解决办法
842
查看次数

"现代"HList?

HList包是基于什么是现哈斯克尔技术.简单的问题是:鉴于过去8年Haskell/GHC开发的所有新功能,"现代"HList的构建方式会有很大不同吗?我意识到这里的答案可能不是,对于HList的特定情况,使用的技术仍然可以产生最优雅的解决方案.

我已经阅读了可扩展记录页面上记录的许多项目,唯一真正的竞争对手(即实现为hackage上可用库的一个)是记录包.或者是否有可扩展记录的链接?

haskell record

30
推荐指数
1
解决办法
1928
查看次数

.cabal文件语法的完整定义

我已经广泛搜索了,虽然我可以找到很多cabal文件的例子以及很好的教程,但我希望对.cabal文件格式有一个正确的语法定义.唉,我一直都找不到.最近的cabal文档仅提到它的文件格式是向后兼容的 - 没有链接到它与之兼容的'原始'格式!没有用.

haskell cabal

26
推荐指数
2
解决办法
1925
查看次数

人们什么时候开始思考'C是便携式汇编程序'?

它似乎是流行的编程语言文化中的"被接受的概念","C是便携式汇编程序".我至少15年前第一次听到这个消息.但什么时候它真的成为流行文化的一部分?

注意:如果您不同意'C是便携式汇编程序',请跳过此问题.这个问题是关于"流行的编程文化".我会在这个问题上添加评论,你可以对那些不同意该陈述的人进行投票.

c

23
推荐指数
3
解决办法
6922
查看次数

键入的元编程语言

我想用静态类型语言做一些元编程,我的程序和我的元程序都将被输入.我的意思是强烈的意义:如果我的程序生成器编译,我希望类型系统足够强大,只能生成类型正确的程序.

据我所知,只有metaocaml才能做到这一点.(不,模板Haskell和C++模板都不符合要求 - 参见本文).问题:其他语言/系统允许哪些内容?

编辑:据我所知,metaocaml已经死了.奥列格试图恢复它,但这仍然是OCaml本身背后的几个版本.如果一个人想要使用实验语言(即甚至比metaocaml更多),看起来Ur和很可能是Idris符合这个要求.还有其他新的参赛作品吗?

static-typing metaprogramming

15
推荐指数
3
解决办法
1262
查看次数

Tardis monad的附加功能

我们知道单子来自于附加语SO也对此进行了讨论)。编程中通常使用的monad来自著名的附加语。那么Tardis monad来自哪里?(RevState也很高兴知道)。

monads haskell categories category-theory

8
推荐指数
0
解决办法
186
查看次数

试图将一个包装类型的家族变成类似Functor的东西

这是一个简单的示例,其中标识Functor运行良好:

newtype R a = R a

instance Functor R where
    fmap f (R a) = R $ f a
Run Code Online (Sandbox Code Playgroud)

但如果我添加一个中间类型的家庭,事情会变得很糟糕:

data IntT
data a :-> b

type family   Sem a         :: *
type instance Sem IntT      = Int
type instance Sem (a :-> b) = Sem a -> Sem b

newtype S a = S (Sem a)
Run Code Online (Sandbox Code Playgroud)

现在我无法将S变成Functor.我可以很容易地定义一类类似类似Functor的东西,但是我还需要一类类似Applicative和Monad的东西,这似乎是一条不愉快的道路.特别是

smap f (S a) = S $ f a
Run Code Online (Sandbox Code Playgroud)

实际上有我想要的类型,即smap :: (Sem a -> Sem b) -> S a -> …

haskell

7
推荐指数
1
解决办法
315
查看次数

如何与多位作者联系使用haskell包

所有关于如何对Haskell包进行cabal化的教程和示例都假设该包具有单个作者(以及单个维护者).如何正确归功于.cabal文件中的多个作者?

haskell cabal

5
推荐指数
1
解决办法
382
查看次数

Coq中的简单身份

我可能遗漏了一些基本的东西.

我可以证明以下"身份":

Theorem identity_simple : forall a : Prop, a -> a.
Run Code Online (Sandbox Code Playgroud)

随着intro. intro. assumption..

但是,我似乎无法证明:

Theorem identity : forall a : Prop, a.
Run Code Online (Sandbox Code Playgroud)

我当然能做到intro,但这让我:

a : Prop
_________(1/1)
a
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做.
第一种形式似乎是多余的,表明对所有人而言a,a意味着a.

theorem-proving coq

1
推荐指数
1
解决办法
132
查看次数