2016-08-14 3 views
0

でカスタムタイプを使用しているために、stack ghciを実行しようとしたとき、私は次のタイプに怒鳴るハスケル:エラーGHCiの

succeed :: a -> Parser a 
succeed v = \inp -> [(v,inp)] 

として

type Parser a = String -> [(a,String)] 

とパーサを操作するためにいくつかの機能を宣言しました上記の関数をテストするためにsucceed私はParserがshowのインスタンスではないというエラーが出るので、コードを更新して次を追加しようとしました。

instance Show Parser where 
    show [(v,inp)] = show (v,inp) 

が、私はShowは、引数は*ことを期待しているというエラーが発生しましたが、それは私が、私はGHCiで私の機能をテストすることができることを解決できる方法* -> *

のですか?

答えて

3

申し訳ありませんが、短い答えは:これを行うことはできません。 thisの質問を参照、説明は

newtype Parser a = Parser [(a, String)] 

instance Show (Parser a) where 
    ... 

長い答えはnewtypeを使用することを含みます。

+0

私がしたが、コンパイラは私が試した「ショー(パーサA)」 ' –

+0

@Threex、のための'違法なインスタンス宣言を行いましたそのコードがなく、ghciで実行 '成功"テスト "'と私はエラーが表示されます。Parser aは表示 –

+0

@khaledomarのインスタンスではありません。私の編集を参照してください。 – ThreeFx

1

だけGHCiでこれを入力します。

let succeed :: a -> String -> [(a, String)]; succeed v = \inp -> [(v, inp)] 

テスト:

succeed 12 "str" 

出力:

[(12,"str")] 

テスト:

Prelude> :t succeed 
succeed :: a -> String -> [(a, String)] 

また、これはGHCiで動作します。

type Parser a = String -> [(a,String)] 
let succeed :: a -> Parser a; succeed v = \inp -> [(v, inp)] 

テスト:

succeed 12 "str" 

出力:

[(12,"str")] 

テスト:

Prelude> :t succeed 
succeed :: a -> Parser a 
0123を
+0

@ khaled-omar私はこれが助けてくれることを願っています –

+0

GHCIで役立ちますが、エディターで全体を作成し、GHCIで私のコードをテストします。 –

1

これは本当にあなたが望むものではないと思います。このタイプのパーサを定義するための通常の方法は、パーサ自身がその結果リストである機能ある

newtype Parser a = Parser {runParser :: String -> [(a, String)]} 

です。非常に意味のあるものを実際に表示することはできません。他の回答がで取得する1つのオプションは、パーサの結果のためにカスタム型を作成することです:

newtype Parser a = Parser {runParser :: String -> Result a} 

newtype Result a = Result {getResult :: [(a, String)]} 

instance Show a => Show (Result a) where 
    show (Result xs) = case xs of 
    [] -> "No results" 
    [x] -> "One result: " ++ show x 
    _ -> "Multiple results"