[英]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 a
的List 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.