使用 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>
但是你的函数也比较复杂。您可以通过以下方式简化 isValidChar
和 isValidInt
:
isValidChar :: Char -> Bool
isValidChar x = 'A' <= x && x <= 'H'
isValidInt :: Char -> Bool
isValidInt x = '1' <= x && x <= '4'
对于 toPosition
函数,您可以在列表上使用模式匹配,因为 String
是 Char
s:
的列表
import Data.Char(digitToInt)
toPosition :: String -> Maybe Position
toPosition [c, n]
| isValidChar c && isValidInt n = Just (Position c (digitToInt n))
toPosition _ = Nothing
我正在开发一个 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>
但是你的函数也比较复杂。您可以通过以下方式简化 isValidChar
和 isValidInt
:
isValidChar :: Char -> Bool
isValidChar x = 'A' <= x && x <= 'H'
isValidInt :: Char -> Bool
isValidInt x = '1' <= x && x <= '4'
对于 toPosition
函数,您可以在列表上使用模式匹配,因为 String
是 Char
s:
import Data.Char(digitToInt)
toPosition :: String -> Maybe Position
toPosition [c, n]
| isValidChar c && isValidInt n = Just (Position c (digitToInt n))
toPosition _ = Nothing