2009-08-25 11 views
7

私はHaskellのと初心者です、私はのようなエラーを見始めました:私はghci内およびghcにだけ原因、それは私が検索で見つかった最初のものだったという事実のために働いていますハスケル:-fglasgow-extsはこれを必要とするコードを避けるべきでしょうか?

​​

を。

これが前進するのを避けたい状況のタイプであるかどうか不思議です。私が検索したすべての検索では、これらの拡張が役立つかもしれない(またはそうでないかもしれない)基礎的な機能を公開していると言及しています。

具体的な例としては、

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

である私はabの両方が同時にリストから読んでいるという事実が、ここで問題が発生すると仮定しますか...?だからグラスゴーの拡張がこのコンストラクトをサポートする唯一の手段であれば、リストを別の方法で生成することや、拡張が利用できると仮定することがより一般的ですか?

事前にお問い合わせいただきありがとうございます。

[編集] 申し訳ありませんが、これは完全にはっきりしませんでしたが、グラスゴー(またはその他の)拡張子を含むことが悪い練習とみなされる場合は私の質問です。上の例は、この質問を促したエラーの種類を説明するためのものです。

答えて

12

代わりのすべて GHC拡張を要求し、LANGUAGEプラグマメカニズムを使用して使用されているものを指定します。

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

私はab両方がでリストから読んでいるという事実を前提とし 同じ時間はここで問題を引き起こします...?だから、 グラスゴーの拡張機能が唯一の場合は、 は、この構造をサポートすることを意味します リストを生成するのがより一般的です 拡張機能が利用可能になると仮定しますか?

同じリストに対する並列反復が許可されます。問題は、並列理解はHaskell 98標準で定義されていないということです。彼らは簡単にzipを使用してシミュレートすることができます。

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

自体は悪くない拡張機能 - 標準ライブラリの多くは一種または別の、拡張子を使用しています。多くは、Haskell標準の次の反復であるHaskell'に含めると考えられています。GADTなどの一部の拡張機能は、ユーザー作成のライブラリ全体でよく使用されます。 実際にはあなたがしていることを知っていない限り、テンプレートやインコヒーレントなインスタンスなど、他のものはおそらく使用するのは良い考えではありません。

HaskellExtensions wiki pageに記載されている拡張子は、2つ以上のコンパイラからサポートされているため、おそらく安全です。何をしたい

+0

右、私はそれはまだ仮定しています特定の拡張をコードベースに挿入します。私の質問はそれが良い練習であるかどうかです。例えば、C言語では#includeディレクティブにソースファイルを自由に組み込むことができますが、これは悪い習慣とみなされます。 – ezpz

+0

@ezpz:そうです。私は私の答えを更新します。短いバージョン:それは拡張機能に依存しますが、多くは安全であり、使用するにも有益です。私は、並列理解はそれほど広く普及しているとは考えていません。 –

+0

リンクをありがとう - それは私が検討しようとしている情報のタイプです。 – ezpz

6

GHCは広く普及しています - 私はその最もよく使われているHaskellコンパイラだと思いますので、あまり問題にはならないでしょう。あなたは常に、標準に準拠したコードを書こうとするべきです。個人的なプロジェクトではなく、OSSや仕事のためのコードであることは間違いありません。

何かが起こる可能性があります。したがって、プロジェクトの途中でコンパイラが途中で突然変更される可能性があります。

OSSでは、さまざまな人が異なるコンパイラを使用します。たとえば、HUGSも非常に一般的です。

3

は次のとおりです。

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

リストの内包が本当に自己参照リストを操作していないためです。また、GHCがより一般的ですが、HUGSは一般的により明確なエラーメッセージを生成します。

+0

OT:クリーナーのエラー出力の外に、あなたはGHCを越えてHUGSを提案しますか? – ezpz

+3

>あなたはGHCを越えてHUGSを提案しますか? 絶対にありません。 GHCはデファクトスタンダードであり、生産に使用される唯一のシステムです。 –

+2

Hugsを使って作業することは、コードをより移植性の高いものにするのに役立ちます。これは、あなたのコードがどのように生きることが期待されるかに依存して、古いか代替のHaskellシステムのユーザーにとって重要です。 –

6

拡張機能の使用は問題ありません。特に-XFooまたはLANGUAGE FOOを使用してフラグを立てます。 あなたが選択した拡張機能はあなた次第です。あなたがHaskell Primeに含めるためにリストアップしたものに固執したいと思うかもしれません。

1

私は、 ""の代わりに ","を使用するように提案していましたが、これは私が期待した以外の何かを学んでいました。

したがって、移植性に加えて、読みやすさも考慮する必要があります。一般的でない拡張機能を使用すると、コードを読みにくくなる可能性があります(拡張機能に精通していないユーザー向け)。

一部の拡張機能は、MultiParamTypeClasses,FlexibleContexts,FlexibleInstancesなどの可読性に悪影響を与えません(結果コードは明白です)。

他の人は、新しい構文とこの構文の意味を理解しておくことが必要です。それらの例は、ParallelListComp,TypeFamilies,FunctionalDependenciesとなります。この場合、これらの拡張が利益をもたらさない限り、これらの拡張を避けることをお勧めします。この場合、John Millikinが示唆したようにzipを使用するか、コードを不明示唆としてリファクタリングすることができます。

Haskell Primeに含める予定のものを使用した場合の+1の提案。

ハスケル2010、9月3日組み込まれる一連の変更は、Haskellのシンポジウムで発表される2009年後半にリリースされる予定である2009年

関連する問題