簡體   English   中英

Idris解析器組合器GADT

[英]Idris parser combinator GADT

我目前正在Idris中實現一個簡單的解析器組合器庫,以學習該語言並總體上更好地理解類型系統,但是在圍繞如何聲明和使用GADT方面遇到一些麻煩。 我試圖配制的樣子(在Haskell)解析器數據類型: type Parser a = String -> [(a,String)] ,從紙張。 基本上,類型是一個接受字符串並返回列表的函數。

在伊德里斯,我有:

data Parser : Type -> Type where
    fail : a -> (String -> [])
    pass : a -> (String -> [(a,String)])

其中fail實例是一個總是失敗的解析器(即-將是一個始終返回空列表的函數),而pass實例是一個消耗了一些符號的解析器。 將上述內容加載到解釋器時,我收到一個錯誤,即List elem和預期的Type之間存在類型不匹配。 但是,當我用:t String -> List Type String- :t String -> List Type在repl中檢查解析器的返回類型時,我得到Type ,看起來應該可以工作。

如果有人能很好地解釋為什么此數據聲明不起作用,或者是表示解析器數據類型的更好替代方法,我將不勝感激。

在定義數據類型解析器時,第一行表示此類型接受一個類型並返回一個類型,在這種情況下,它接受一個a並返回一個Parser a

因此,您的構造函數應返回Parser a

類似於List接受a並返回List aList a

您當前在構造函數中返回的內容不是Parser類型-很容易看到,因為Parser一詞在右側沒有出現。

除此之外,我不確定您如何最好地表示這一點。 但是,已經有一些用Idris編寫的解析器庫了,看一下這些庫是否有幫助? 例如,看一下此庫列表,首先提到的是解析器: -Idris庫

在Haskell,

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

不會創建新的類型,它只是類型的同義詞。 您可以在Idris中執行類似的操作

Parser : Type -> Type
Parser a = String -> List (a, String)

然后將幫助程序定義定義為返回Parser a的簡單函數:

fail : Parser a
fail = const []

pass : a -> Parser a
pass x = \s => [(x, s)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM