gpt4 book ai didi

haskell - 在 Haskell 中从未知序列创建不同类型?

转载 作者:行者123 更新时间:2023-12-04 04:29:33 26 4
gpt4 key购买 nike

假设一个函数“获取”一个信息序列(例如一个字符列表),并且应该从中创建不同的类型,其中它的类型取决于表示内容的输入序列 - 并假设类型已经给出。

numFromString :: [Char] -> ???
我想有几种可能。
我的第一个想法是使用类型参数。
main :: IO ()
main =
do
sLine <- getLine
print $ numFromString sLine

numFromString :: (Show a, Read a) => String -> (Maybe a)
numFromString ('I':'n':'t':'e':'g':'e':'r':rs) = Just ((read rs) :: Integer)
-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^ this does not work
numFromString ('I':'n':'t':rs) = Just ((read rs) :: Int)
numFromString _ = Nothing
...但我们不能只提供一个 Integer 类型变量,或者我们可以吗?
我的第二个想法是使用类型类
main :: IO ()
main =
do
sLine <- getLine
print $ ((numFromString sLine) :: (Maybe Integer))
-- ^^^^^^^^^^^^^^^ I have to decide in advance which type I want to get

class (Show a, Read a) => XClass a where
numFromString :: String -> (Maybe a)

instance XClass Int where
numFromString ('I':'n':'t':rs) = Just ((read rs) :: Int)
numFromString _ = Nothing

instance XClass Integer where
numFromString ('I':'n':'t':'e':'g':'e':'r':rs) = Just ((read rs) :: Integer)
numFromString _ = Nothing
...但这也不起作用,当我们使用 numFromString 时,是吗?
我的第三个想法是使用 sum 类型的数据类型。
main :: IO ()
main =
do
sLine <- getLine
print $ numFromString sLine

data X = XInt Int | XInteger Integer | XNone
deriving Show

numFromString :: String -> X
numFromString ('I':'n':'t':'e':'g':'e':'r':rs) = XInteger (read rs)
numFromString ('I':'n':'t':rs) = XInt (read rs)
numFromString _ = XNone
有没有更优雅的方式?
泛型编程会有帮助吗?
它会是什么样子?

最佳答案

您的 sum 类型方法对我来说似乎是正确的方法。
举个例子:

  • JSON 文档的第一个字符决定了一个类型——{对于对象,[对于列表,"用于字符串等aeson ,一个流行的 Haskell JSON 解析器,使用 a sum type可以代表其中的每一个。
  • 解析 CBOR 涉及几乎相同的情况。 cborg使用 a sum type捕捉所有的可能性。
  • 智能游戏格式可以代表各种游戏的移动记录。存储移动所需的信息类型因游戏而异。 sgf图书馆使用 a sum type捕捉可能性。

  • ...等等。

    关于haskell - 在 Haskell 中从未知序列创建不同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67744014/

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