2017-02-04 3 views
1

Я смотрю эту страницу на optparse-generic.Haskell Optarse Общий пример сбоя на TypeOperators и DataKinds

с этой версией optparse:

$ 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 
λ> 

Как вы можете видеть , У меня есть как DataKinds, так и TypeOperators. Как я могу отладить, что здесь происходит?

+0

Как вы загружаете файл? '' частей сообщения об ошибке заставляет меня думать, что вы вводите пример в сеансе GHCI напрямую, уверены ли вы, что расширения включены? (Пример отлично работает при загрузке из файла на моем конце) – adamse

+0

Загрузил файл с частями над определением 'data Example'. Введена вторая часть в ghci. – Mittenchops

+0

Если все в файле, все в порядке. Но я не могу проверить и определить эти типы данных в ghci? – Mittenchops

ответ

3

Проблема в том, что GHCi не наследует расширения из загруженного вами файла.

Чтобы узнать, какие расширения загружены в GHCi, используйте :show language и для включения расширения, например TypeOperators, используйте :set -XTypeOperators.

Существует запрос функции (билет GHC #11469), чтобы GHCi включал языковые расширения из загруженного файла, но, похоже, он малоактивен.

+0

Huh. Поэтому, когда есть перегруженные строки и т. Д., И я работаю над интерактивным сеансом, я должен всегда начинать с повторного объявления этих файлов, даже если я источник файла, где они объявлены? – Mittenchops

+0

Кажется, что в настоящее время я должен сказать, что я был удивлен! См. Связанный билет, как это может измениться в будущем (обратите внимание, что оригинальное предложение было написано 8 лет назад.) – adamse

+0

Увлекательный. (1) В ходе разработки Haskell у вас просто есть рабочий процесс, который вообще не использует ghci, или вы всегда будете импортировать один и тот же набор материалов в начале интерактивных сеансов? (2) Неужели это так? Я чувствую, что я не избыточно объявлял OverloadedStrings в ghci, но, возможно, смог проверить все, используя его. – Mittenchops