使用 Haskell 将字符串转换为我自己的数据类型

Convert Strings into my own data type with Haskell

我正在开发一个 Haskell 函数,它将把字符串转换为自定义数据类型:Position,它应该只包含一个字符 (A-H) 和一个 Int(1 -4).(即A1, B3, H4)

这里是函数的用法:toPosition 只给出由字符串命名的 Position,如果字符串不是有效的 Position 名称,则返回 Nothing。

这是我的尝试:

我定义数据类型为:

data Position = Pos Char Int

我在终端中尝试 运行 它:

toPosition "H2"

GHCi 返回错误:

No instance for (Show Position) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it

有人对此有想法吗? 如有任何帮助,我们将不胜感激!

这引发错误的原因是它无法打印 Position,因为您没有将其作为 Show 的实例。因此,您可以将其实现为:

data Position = Pos Char Int <strong>deriving Show</strong>

但是你的函数也比较复杂。您可以通过以下方式简化 isValidCharisValidInt

isValidChar :: Char -> Bool
isValidChar x = 'A' <= x && x <= 'H'

isValidInt :: Char -> Bool
isValidInt x = '1' <= x && x <= '4'

对于 toPosition 函数,您可以在列表上使用模式匹配,因为 StringChars:

的列表
import Data.Char(digitToInt)

toPosition :: String -> Maybe Position
toPosition [c, n]
    | isValidChar c && isValidInt n = Just (Position c (digitToInt n))
toPosition _ = Nothing