2017-11-12 10 views
1

SafariBookOnline에서 Richard Cook이 만든 비디오를보고있었습니다. 그는 Haskell과 함께 명령 행 응용 프로그램을 작성합니다. 이 비디오에서는 명령 줄 인수를 구문 분석하는 프로그램을 작성하는 동안 몇 가지 기본 개념을 설명합니다.오류 : "optlse-applicative 라이브러리의 범위를 벗어나는 변수 (<>)"

나는 하스켈 아주 새로운 오전, 나는이 코드가 작동하지 않는 이유를 알아낼 수 없습니다 :

dataPathParser :: Parser FilePath 
dataPathParser = strOption $ 
    value defaultDataPath 
    <> long "data-path" 
    <> short 'p' 
    <> metavar "DATAPATH" 
    <> help ("path to data file (default " ++ defaultDataPath ++ ")") 

이 코드에서 잘 작동하지 않습니다 : 실제로

itemDescriptionValueParser :: Parser String 
itemDescriptionValueParser = 
    strOption (long "desc" <> short 'd' <> metavar "DESCRIPTION" <> help "description") 

그리고, 사방, 나는 컴파일러가 저를 알려주는 오류가 발생했습니다 "> <"쓴 :

• Variable not in scope: 
    (<>) :: Mod f5 a5 -> Mod f4 a4 -> Mod ArgumentFields ItemIndex 
• Perhaps you meant one of these: 
    ‘<$>’ (imported from Options.Applicative), 
    ‘<*>’ (imported from Options.Applicative), 
    ‘<|>’ (imported from Options.Applicative) 

내가 가진 문제는 아마도 GHC와 Optparse-applicative의 버전의 차이 때문일 것입니다. 나는 최신 것들을 사용한다. LTS 하스켈 9.12 : 0.13.2.0.

하지만 저는 아주 새로 워서 Richard Cook 코드를 다시 작성하는 방법을 알 수 없습니다.

어떤 도움을 주셔서 감사합니다. 사전에

감사합니다, 알렉스

답변

4

http://hackage.haskell.org/package/optparse-applicative-0.14.0.0/docs/Options-Applicative.html#t:Parser :

A modifier can be created by composing the basic modifiers provided by here using the Monoid operations mempty and mappend , or their aliases idm and <> .

는하지만, <> 수출하지 않는 것 같습니다, 그래서 당신은 Data.Monoid에서 그것을 얻을해야합니다

import Data.Monoid 

... 또는 단지 :

import Data.Monoid ((<>)) 
+0

고마워요! 그것은 당신에게 사소한 것처럼 보일지 모르지만 나는 하스켈에서 시작하고 있으며, 코드에서의 문제에 대해 생각했습니다. 다시 한 번 감사드립니다! –

+0

@Alexk 그래, 이건 분명하지 않다. 예는 optparse-applicative의 이전 버전에 대해 작성된 것으로 보이는데,'(<>) '를 내보내었지만 이해가 안되는 이유로 변경되었습니다 : https://github.com/pcapriotti/optparse - 적용/문제/224 – melpomene