代码之家  ›  专栏  ›  技术社区  ›  ezpz

haskell:-fglasgow exts应该避免使用需要这样做的代码吗?

  •  7
  • ezpz  · 技术社区  · 16 年前

    我是Haskell的初学者,我开始发现类似以下错误:

    Illegal parallel list comprehension: use -fglasgow-exts
    

    我在里面工作 ghci ghc 但这只是因为它是我在搜索中发现的第一个。

    我很好奇这是否是一个人想要避免前进的情况。我看到的任何搜索都提到这些扩展暴露了可能(或不一定)有用的基础设施。

    一个具体的例子是

    fibs = 0 : 1 : [ a + b | a <- fibs | b <- tail fibs ]
    

    我认为事实上两者都 a b 同时从列表中读取是否会导致此处出现问题…?因此,如果格拉斯哥扩展是支持这个构造的唯一方法,那么用另一种方式生成列表还是假设扩展是可用的呢?

    提前感谢您的任何意见。

    [编辑] 对不起,如果这不完全清楚,但我的问题是,包括格拉斯哥(或任何其他)延长被认为是不好的做法。上面的例子只是为了说明引起这个问题的错误类型。

    5 回复  |  直到 16 年前
        1
  •  12
  •   John Millikin    16 年前

    而不是请求 全部的 GHC扩展,使用 LANGUAGE pragma机制:

    {-# LANGUAGE ParallelListComp #-}
    xy = [ x+y | x <- [1, 2, 3, 4] | y <- [5, 6, 7, 8] ]
    

    我认为事实上两者都 a b 正在从列表中读取 同时在这里引起问题…?所以, 如果格拉斯哥延长线是唯一 支持这个结构的方法是 生成列表更常见 或者假设 是否提供扩展?

    允许在同一列表上并行迭代。问题是哈斯克尔98标准中没有定义并行理解。它们可以很容易地用 zip :

    xy = [x+y | (x,y) <- zip [1, 2, 3, 4] [5, 6, 7, 8]]
    

    扩展本身并不坏——许多标准库都使用某种类型的扩展。许多人正在考虑加入 Haskell' 哈斯克尔标准的下一次迭代。一些扩展,例如gadt,通常在用户编写的库中使用。其他的,如模板或不连贯的实例,可能不是一个好主意,除非你 真的? 知道你在做什么。

    中列出的任何扩展名 HaskellExtensions wiki page 有了两个或更多编译器的支持,使用起来可能是安全的。

        2
  •  6
  •   Lucas Jones    16 年前

    GHC绝对是无处不在的-我认为它是最常用的haskell编译器,所以它可能不会造成太多的麻烦。不过,您应该始终尝试编写符合标准的代码——可能不是针对个人项目,而是针对OSS或Work项目。

    什么事都有可能发生,对吧?所以在项目的中途编译器可能会突然发生变化。

    对于OSS,不同的人使用不同的编译器——例如,拥抱也是很常见的。

        3
  •  6
  •   Don Stewart    16 年前

    使用扩展是可以的。特别用-xfoo或语言foo标记它们。 您选择使用哪些扩展取决于您自己,您可能希望坚持那些列在haskell prime中的扩展。

        4
  •  3
  •   Lucky    16 年前

    你想要的是:

    fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
    

    这是因为列表理解实际上不适用于自引用列表。此外,尽管温室气体排放量更受欢迎, HUGS 通常会产生更清晰的错误信息。

        5
  •  1
  •   yairchu    16 年前

    我打算建议使用 , “而不是” | “,但后来我了解到这做了一些出乎意料的事情。

    所以除了可移植性之外,还应该考虑可读性。使用不常见的扩展可能会使代码更难阅读(对于不熟悉扩展的人)。

    一些扩展对可读性没有任何负面影响(结果代码很明显),比如 MultiParamTypeClasses , FlexibleContexts , FlexibleInstances .

    另一些则要求读者熟悉新的语法,并理解这种语法的含义。例如: ParallelListComp , TypeFamilies , FunctionalDependencies . 在这种情况下,我建议尽量避免这些扩展,除非它们带来好处。在这种情况下,您可以使用 zip 正如约翰米利金建议的那样,或者按照未知的建议重构代码。

    +1 DONS关于使用计划中包含的内容的建议 Haskell Prime .

    Haskell2010将于2009年底发布。将在2009年9月3日的Haskell研讨会上宣布合并的一系列变更。

    推荐文章