簡體   English   中英

Haskell:在GHCi中使用自定義類型時出錯

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

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