gpt4 book ai didi

Haskell - 阅读人员名单

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

问题听起来像这样:编写一个程序,读取一个数字 n 然后 n 个人,对于每个人,读取他们的姓名和年龄,然后返回最年长的人/人。

示例输入:

3
Ion Ionel Ionescu
70
Gica Petrescu
99
Mustafa ben Muhamad
7

示例输出
Oldest is Gica Petrescu (99 years).

到目前为止我的代码:
readPers :: IO(String, Int)
readPers = do
name <- getLine
age <- readLn :: IO Int
return (name, age)

readPerss :: (Ord t, Num t) => t -> [IO (String, Int)]
readPerss n
| n > 0 = readPers : readPerss(n-1)
| otherwise = []

pFunc = do
print "Numer of persons:"
n <- readLn :: IO Int
let persons = readPerss n
return persons

我首先阅读 n,然后尝试使用 readPers 和 readPerss 列出人员列表,但我被卡住了,我不知道从那时起如何解决它,我想我到目前为止的实现并不完全正确。

我应该如何解决问题?

最佳答案

你很亲近!您在 readPerss :: (Ord t, Num t) => t -> [IO (String, Int)] 中所做的事情正在返回 IO 的列表行动;每个 Action 返回一对 StringInt执行时。目前在pFunc您只是在构建此操作列表,并将其存储在带有 let 的变量中, 并从 pFunc 返回;你永远不会用 <- 执行它们“绑定(bind)”声明。

有一些简单的方法可以做你想做的事。对代码进行的最小更改就是添加 sequence ,它接受一个 Action 容器并产生一个返回容器的 Action :

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)

这里 t[] , mIO , 和 a(String, Int) :
sequence :: [IO (String, Int)] -> IO [(String, Int)]

另一种方法是重写 readPerss以便它直接执行操作,累积 (String, Int)结果是一个列表,而不是累积 IO行动:
readPerss :: (Ord t, Num t) => t -> IO [(String, Int)]
-- Change [IO …] to IO […]: ~~~~~~~~~~~~~~~~~~

readPerss n
| n > 0 = do
pers <- readPers
perss <- readPerss (n - 1)
return (pers : perss)
| otherwise = return []

我知道如果这是家庭作业或练习,您可能不应该使用库函数,但在典型代码中“重复 x行动 n次并累积结果”通常用 replicateM n x 表示:
replicateM :: Applicative m => Int -> m a -> m [a]

关于Haskell - 阅读人员名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54057041/

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