gpt4 book ai didi

haskell - 在 Haskell 中,用户如何将项目添加到列表中

转载 作者:行者123 更新时间:2023-12-02 14:08:19 25 4
gpt4 key购买 nike

我了解如何使用递归数据结构来管理事物列表:

data Thingy a = NoThingy | Thingy a a (Thingy a) deriving (Show, Read)

firstThingsFirst :: a -> a -> (Thingy a)
firstThingsFirst a b = Thingy a b NoThingy

andAnotherThing :: a -> a -> Thingy a -> Thingy a
andAnotherThing a b NoThingy = Thingy a b NoThingy
andAnotherThing a b things = Thingy a b things

在 ghci 中我可以做类似的事情:

let x=andAnotherThing "thing1" "thing2" NoThingy
let y=andAnotherThing "thing3" "thing4" x

但是,我不知道如何使其适用于需要用户输入的已编译程序。换句话说,我想让用户填写结构。像这样的东西:

import System.IO
allThings=NoThingy
main = do
putStrLn "First Thing"
first<-getLine
putStrLn "Second Thing"
second<-getLine
let allThings=Thingy first second allThings
print allThings
main

最佳答案

Haskell 中的值是不可变的,因此如果您“将项目添加到列表中”,您会得到一个新列表。所以在上面的代码中,

let allThings = Thingy first second allThings

没有达到您的预期。顶级 allThings 的值为 NoThingy 并且无法更改。 let 绑定(bind)中的名称 allThings 并不引用顶级实体,它引入了一个新的绑定(bind)来隐藏顶级名称,并且该新名称也在绑定(bind)的右侧。因此该行和以下内容相当于

let theThings = Thingy first second theThings
print theThings

let 绑定(bind)创建一个循环结构,将自身称为其组件之一。这当然意味着打印永远不会完成。

您(可能)想要做的事情需要将要更新的结构作为参数传递

loop things = do
putStrLn "First Thing"
...
let newThings = Thingy first second things
print newThings
loop newThings

当然,就像尼古拉斯所说,您可能希望将输入字符串转换为适当类型的值。

关于haskell - 在 Haskell 中,用户如何将项目添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8138879/

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