gpt4 book ai didi

haskell - 如何从 Haskell 中任意类型 [a] 的标准输入中读取列表?

转载 作者:行者123 更新时间:2023-12-01 10:34:38 25 4
gpt4 key购买 nike

我正在编写一个函数,它接受任意列表并比较它们以查看一个是否是另一个的子列表。对于标准输入,我想向用户询问两个列表,但我想不出接受任意类型的方法。到目前为止,这是我的代码:

1  main :: IO ()
2 main = do
3 l1 <- getLine
4 l2 <- getLine
5 print $ sublist (read l1 :: [Int]) (read l2:: [Int])
6
7 sublist :: Eq a => [a] -> [a] -> Bool
8 sublist b p = any ((b ==) . take len) . takeWhile ((len<=) . length) $ iterate tail p
9 where len = length b

我的主要问题是第 5 行,我必须在其中为 read 选择一个类型。

我希望拥有一些输入和输出示例,但我目前一次只能支持一个:

>>> [1,2,3]
[1,2,3,4,5]
True

>>> ["a", "bc"]
["xy", "b", "bc"]
False

>>> [True, False, True]
>>> [False, True, False, True]
True

-- And even nested types
>>> [[1], [2,3]]
[[2,4], [1], [2,3], [4]
True

如有任何帮助,我们将不胜感激!

最佳答案

read 必须提前知道它正在阅读什么样的东西 - 这就是它的工作方式。

不是 read 查看字符串以确定返回什么类型的情况。例如考虑:

read "1" :: Float
read "1" :: Int

第一次读取将返回 Float (1.0),第二次读取将返回 Int (1),即使读取的字符串完全相同。

您可能认为这与其他语言不同,例如 Python,您可以在其中评估 "[1,2,3]" 并获取列表并评估 "5" 得到一个数字,你不必告诉 eval 返回什么样的东西。然而,Haskell 对此的回答是那些语言实际上只处理一个类型,它是一个求和类型,例如:

data PyVal  = PyNum Int
| PyStr String
| PyList [ PyVal ]
| PyDict [ (PyStr, PyVal) ]
| ...

因此,可能的表达方式是封闭的。所以,实际上,eval 知道它正在读取什么样的东西。在 Haskell 中,您始终可以添加新类型,从而添加新的阅读器和显示函数。

关于haskell - 如何从 Haskell 中任意类型 [a] 的标准输入中读取列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37903867/

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