24

我使用 Haskell 已经有一段时间了。我使用它的次数越多,我就越爱上这种语言。我简直不敢相信我已经用其他语言度过了将近 15 年的生命。

然而,我逐渐厌倦了 Haskell 的标准库。我的主要烦恼是“不够多态”的定义(Prelude.map,Control.Monad.forM_等)。我有很多 Haskell 源代码文件,它们的第一行看起来像

{-# LANGUAGE NoMonomorphismRestriction #-}

module Whatever where

import Control.Monad.Error hiding (forM_, mapM_)
import Control.Monad.State hiding (forM_, mapM_)
import Data.Foldable (forM_, mapM_)

{- ... -}

为了避免不断地胡扯我应该隐藏哪些定义,我希望有一个或少量的源代码文件,将这个import样板包装成可管理的单元。

所以...

  1. 有没有其他人尝试过这样做?
  2. 如果上一个问题的答案是“是”,他们是否发布了生成的样板包装源代码文件?
4

1 回答 1

9

它并不像你想象的那么清晰。我将列出我能想到的所有缺点:

首先,这些功能的通用性没有限制。例如,现在我正在为包含普通类型的索引类型编写一个库。您提到的每个函数都有一个更通用的索引等效项。我希望每个人都切换到我的图书馆吗?不。

这是另一个例子。mapM 函数定义了一个满足 Kleisli 范畴中的函子定律的高阶函子:

mapM return = return
mapM (f >=> g) = mapM f >=> mapM g

所以我可以争辩说你的可遍历泛化是错误的,相反我们应该把它泛化为高阶仿函数类的一个实例。

此外,请查看 category-extras 包以获取包含所有示例的这些高阶类和函数的一些示例。

还有性能问题。许多更专业的函数都有非常精细的实现,极大地提高了性能。有时类公开了承认更高性能版本的方法,但有时他们没有。

还有类型类重载的问题。实际上,我更喜欢尽量减少类型类的使用,除非它们具有从理论而不是方便性得出的合理法则。此外,类型类通常在单态限制方面表现不佳,我喜欢为我的应用程序代码编写没有签名的函数。

还有口味问题。很多人根本不同意什么是最好的 Haskell 风格。我们仍然无法就前奏达成一致。说到这一点,已经有很多尝试编写新的 Preludes,但没有人能就什么是最好的达成一致,所以我们都默认回到 Haskell98 上。

但是,我认为改进事物的整体精神是好的,进步的最大敌人是满足感,但不要以为做任何事情都会有明确的正确方法。

于 2012-06-18T14:36:02.753 回答