[英]ghci configuration - haskell - Error while changing ~/.ghci file
[英]Haskell: error while using custom type in GHCi
我聲明了以下類型
type Parser a = String -> [(a,String)]
以及一些在解析器上作為波紋管運行的功能
succeed :: a -> Parser a
succeed v = \inp -> [(v,inp)]
當嘗試運行stack ghci
以測試上述功能succeed
我得到一個錯誤,即Parser不是show
的實例,因此我嘗試更新代碼並添加以下內容
instance Show Parser where
show [(v,inp)] = show (v,inp)
但我收到一個錯誤,表明Show
期望參數為*
但它為* -> *
我該如何解決,以便可以在GHCi
測試我的功能?
好吧,簡短的答案是:您不能這樣做。
長的答案包括使用newtype
:
newtype Parser a = Parser [(a, String)]
instance Show (Parser a) where
...
有關說明,請參見該問題。
只需在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
我不認為這不是您想要的。 定義這種類型的解析器的通常方法是
newtype Parser a = Parser {runParser :: String -> [(a, String)]}
解析器本身是一個函數,其結果是一個列表。 您不能真正有意義地展示一個。 其他答案得到的一種選擇是為解析器結果編寫自定義類型:
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.