gpt4 book ai didi

function - 如何在 Haskell 中打印自定义数据类型的名称和值

转载 作者:行者123 更新时间:2023-12-05 01:03:00 25 4
gpt4 key购买 nike

假设我定义了一个数据类型如下:

data OP = Plus | Minus | Num Int     deriving (Show, Eq)

然后我获取 strings 的列表,并获取它们各自的 OP 值的列表,如下所示:

getOp :: [String] -> [OP]
getOp [] = []
getOp (x:rest)
| x == "+" = Plus:(getOp rest)
| isInfixOf "Num" x == True = Num (read (drop 4 x) :: Int):(getOp rest)
| otherwise = "-" = Minus:(getOp rest)

然后我想显示 [OP] 列表,用新行分隔。我已经很容易地用字符串列表完成了它,但不确定如何处理数据类型列表。

我有以下结构作为起点:

showOp :: [OP] -> String
showOp [] = []
showOp (o:os) = (putStr o):'\n':(showOp os)

我知道最后一行是错误的。我试图在第一部分返回一个 [Char],然后是一个 Char,然后是一个递归调用。我为最后一行(见下文)尝试了一些其他变体,但没有成功。

showOp o = show o  (works but not what I need. It shows the whole list, not each element on a new line

showOp o = putStrLn (show o) (epic fail)

showOp o
| o == "+" = "Plus\n":(showOp os)
| more of the same. Trying to return a [Char] instead of a Char, plus other issues.

另外,我不确定 Num Int 类型的输出需要如何不同,因为我需要显示类型名称和值。

这方面的示例 i/o 如下所示:

在:

getOp ["7","+","4","-","10"]

出来:

Num 7
Plus
Num 4
Minus
Num 10

最佳答案

您需要查看您正在使用的函数和对象的类型Hoogle是获取函数签名的绝佳资源。

对于初学者来说,putStr 的签名是

putStr :: String -> IO ()

但你的代码有 putStr o,其中 o 不是字符串,结果不应该是 IO ()。你真的想要 showOp打印 Op,还是只是为它制作一个多行字符串?

如果是前者,则需要showOp的签名来体现:

showOp :: [Op] -> IO ()

然后你可以使用一些 do-notation 来完成这个功能。

我会为你给定的类型签名写一个解决方案。因为 showOp 应该返回一个 StringputStr 返回一个 IO (),所以我们不会使用 putStr 任何地方。请注意,String 只是 [Char] 的类型同义词,这就是我们可以将 String 视为列表的原因。

showOp :: [Op] -> String
showOp [] = [] -- the empty list is a String
showOp (o:os) = showo ++ ('\n' : showos)
where showo = (show o) -- this is a String, i.e. [Char]
showos = showOp os -- this is also a String

showoshowos 都是 String:showshowOp返回 Strings。我们可以使用 cons 操作 : 将单个字符添加到字符列表中。我们可以使用附加运算符 ++ 附加两个字符串列表。

现在你可能想要另一个功能

printOp :: [Op] -> IO ()
printOp xs = putStr $ showOp xs

关于function - 如何在 Haskell 中打印自定义数据类型的名称和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com