2017-02-04 15 views
1

私はoptparse-genericでこのページを見ています。Haskell Optarse TypeOperatorsとDataKindsで失敗する一般的な例

$ stack install optparse-generic-1.1.4 
optparse-generic-1.1.4: download 
optparse-generic-1.1.4: configure 
optparse-generic-1.1.4: build 
optparse-generic-1.1.4: copy/register 

私は与えられたとおりに、このサンプルコードを実行しようとすると::

{-# LANGUAGE DataKinds   #-} 
{-# LANGUAGE DeriveGeneric  #-} 
{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE TypeOperators  #-} 

import Options.Generic 

data Example = Example 
    { foo :: Int <?> "Documentation for the foo flag" 
    , bar :: Double <?> "Documentation for the bar flag" 
    } deriving (Generic, Show) 

を私が手:

<interactive>:10:14-56: error: 
    Illegal operator ‘<?>’ in type ‘Int <?> "Documentation for the foo flag"’ 
     Use TypeOperators to allow operators in types 

<interactive>:10:25-56: error: 
    Illegal type: ‘"Documentation for the foo flag"’ 
     Perhaps you intended to use DataKinds 

<interactive>:11:14-56: error: 
    Illegal operator ‘<?>’ in type ‘Double <?> "Documentation for the bar flag"’ 
     Use TypeOperators to allow operators in types 

<interactive>:11:25-56: error: 
    Illegal type: ‘"Documentation for the bar flag"’ 
     Perhaps you intended to use DataKinds 
λ> 

あなたが見ることができるようにoptparseはこのバージョンの

私はDataKindsとTypeOperatorsの両方を有効にしています。ここで起こっていることをどのようにデバッグできますか?

+0

どのようにファイルをロードしていますか?エラーメッセージの ''部分は、あなたがGHCIセッションに直接サンプルを入力していると思います。拡張機能がオンになっていますか? (この例は、私の最後のファイルからロードされたときに正常に動作します) – adamse

+0

'data Example'の定義の上にある部分を含むファイルをロードしました。 ghciで2番目の部分を入力しました。 – Mittenchops

+0

すべてがファイル内にある場合は、すべて問題ありません。しかし、ghciでこれらのデータ型をテストし定義することはできませんか? – Mittenchops

答えて

3

GHCiは、ロードしたファイルから拡張子を継承しないという問題があります。

GHCiに読み込まれる拡張子を確認するには、:show languageを使用し、拡張子を有効にするには、たとえばTypeOperatorsを使用します。:set -XTypeOperatorsを使用します。

GHCiにロードされたファイルの言語拡張を含めるための機能要求(GHCチケット#11469)がありますが、最近の活動はほとんどないようです。

+0

Huh。だから、オーバーロードされたストリングなどがあり、インタラクティブなセッションで作業しているとき、宣言されているファイルをソースしても、常にそれらを再宣言する必要があります。 – Mittenchops

+0

そのようになっているようですが、私は驚いたと言わなければなりません!これが将来どのように変化する可能性があるかについてはリンク先のチケットを参照してください(元の提案は8年前に書かれています)。 – adamse

+0

魅惑的です。 (1)Haskell開発の過程では、ghciをまったく使用しないワークフローがありますか、インタラクティブセッションの開始時に常に同じセットをインポートしていますか? (2)これは本当にそうすることができますか? ghciでOverloadedStringsを重複して宣言していないような気がしますが、それを使ってテストできましたか? – Mittenchops

関連する問題