ezp*_*zpz 7 haskell coding-style
我是Haskell的初学者,我开始看到类似的错误:
Illegal parallel list comprehension: use -fglasgow-exts
Run Code Online (Sandbox Code Playgroud)
我在内部工作ghci,ghc但仅仅是因为它是我在搜索中找到的第一个.
我很好奇这是否是一种人们希望避免前进的情况.我发现的任何搜索都提到这些扩展会暴露可能(或可能不)有用的基础设施.
一个具体的例子是
fibs = 0 : 1 : [ a + b | a <- fibs | b <- tail fibs ]
Run Code Online (Sandbox Code Playgroud)
我假设这两个a并且b同时从列表中读取的事实会导致问题......?那么,如果格拉斯哥扩展是支持这种结构的唯一方法,那么更常见的是以另一种方式生成列表或者只是假设扩展可用?
提前感谢任何输入.
[编辑]很抱歉,如果这不完全清楚,但我的问题是,如果包括格拉斯哥(或任何其他)扩展被认为是不好的做法.上面的例子只是为了说明提示这个问题的错误类型.
Joh*_*kin 12
而不是请求所有 GHC扩展,使用LANGUAGEpragma机制指定使用哪些扩展:
{-# LANGUAGE ParallelListComp #-}
xy = [ x+y | x <- [1, 2, 3, 4] | y <- [5, 6, 7, 8] ]
Run Code Online (Sandbox Code Playgroud)
我假设这两个
a并且b同时从列表中读取的事实会导致问题......?那么,如果格拉斯哥扩展是支持这种结构的唯一方法,那么更常见的是以另一种方式生成列表或者只是假设扩展可用?
允许在同一列表上进行并行迭代.问题是并行理解没有在Haskell 98标准中定义.它们可以使用zip以下方法轻松模拟
xy = [x+y | (x,y) <- zip [1, 2, 3, 4] [5, 6, 7, 8]]
Run Code Online (Sandbox Code Playgroud)
扩展本身并不错 - 标准库中的大多数都使用某种扩展.许多都被考虑包含在Haskell中,这是Haskell标准的下一次迭代.一些扩展(例如GADT)通常在用户编写的库中使用.其他的,比如模板或不连贯的实例,可能不是一个好主意,除非你真的知道你在做什么.
HaskellExtensions维基页面中列出的任何扩展都有两个或更多编译器的支持,可以安全使用.
GHC绝对是普遍的 - 我认为它是最常用的Haskell编译器,所以它可能不会造成太多麻烦.不过,您应该总是尝试编写符合标准的代码 - 可能不是针对个人项目,而是针对OSS或工作代码.
一切都会发生,对吗?因此,在项目中途可以突然改变编译器.
对于OSS,不同的人使用不同的编译器 - 例如,HUGS也很常见.