gpt4 book ai didi

haskell - 摆脱 Haskell 的 IO ( )

转载 作者:行者123 更新时间:2023-12-01 07:38:29 24 4
gpt4 key购买 nike

我正在编写具有保存/加载当前状态功能的简单应用程序。
保存功能如下:

doSave :: BoardType -> Field -> [Char] -> Bool 
doSave board player fileName = do
let x = encodeFile fileName (board :: BoardType, player :: Field)
True -- there will be exception handling

而我的加载功能:
doLoad :: [Char] -> IO (BoardType, Field)
doLoad fileName = decodeFile fileName :: IO (BoardType, Field)

这是我的问题,加载后,我有 IO (BoardType, Field)这不适合我的程序和其他可能不应该接受的功能 IO参数。如果我关注了这个 IO升级,会有所有 IO s 在我的应用程序中 - 是否有必要(或 - 在 Haskell 语言中是正常的)?

最后 - 有没有一种简单的方法可以摆脱这个 IO ?

最佳答案

需要一点时间来适应。

有些 monad 可以让你在一些工作后提取“内在值(value)”,但 IO 从来没有。

没有办法,例如返回系统时间可以是“纯”的,因此您使用它进行的任何计算都需要保留在 IO 中。

然而,这并不意味着您的大部分代码都在 IO 领域。

main = do
(bt, fld) <- doLoad "somefilename"
let bResult = doSomethingPureWithBoard bt
let fResult = doSomethingPureWithField fld
let bt2 = updateBoard bt bResult fResult
doSave "someFilename" bt2 fld -- This should also be in IO

你总是可以从 IO 调用纯函数,而不是相反。 <-在 IO 函数中为您提供“解包”值。实际上,它正在将结果作为参数传递给下一个“语句”——谷歌搜索“de-sugaring do notation”等类似内容。

关于haskell - 摆脱 Haskell 的 IO ( ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23910235/

24 4 0
文章推荐: VBA 接口(interface)和多态性
文章推荐: markdown - 如何在Markdown表中显示管道 "|"符号?
文章推荐: ruby-on-rails - rails : How to use gem Meta-tags?
文章推荐: heroku - Heroku 上的 Rails 4.0,NoMethodError(#
  • haskell - haskell 中有包含字符串和列表的类型吗?

    现在我正在尝试创建一个基本函数,用于删除句子中的所有空格或逗号。 stringToIntList :: [Char] -> [Char] stringToIntList inpt = [ a | a

  • haskell - 案例中的模式匹配,Haskell

    我是 Haskell 的新手,对模式匹配有疑问。这是代码的高度简化版本: data Value = MyBool Bool | MyInt Integer codeDuplicate1 :: Valu

  • haskell - Haskell 中的这个仿函数是什么意思?

    如何解释这个表达式? :t (+) (+3) (*100) 自 和 具有相同的优先级并且是左结合的。我认为这与 ((+) (+3)) (*100) 相同.但是,我不知道它的作用。在 Learn

  • haskell - Haskell 如何计算表达式

    这怎么行 > (* 30) 4 120 但这不是 > * 30 40 error: parse error on input ‘*’ 最佳答案 (* 30) 是一个 section,它仍然将 * 视为

  • haskell - 删除满足谓词的第一个元素(Haskell)

    我想创建一个函数,删除满足第二个参数中给定谓词的第一个元素。像这样: removeFirst "abab" ( 'b') = "abab" removeFirst [1,2,3,4] even =

  • haskell - Haskell 中的内存

    Context : def fib(n): if n aand returns a memoized version of the same function. The trick is t

  • haskell - 惰性评估和严格评估 Haskell

    我明白惰性求值是什么,它是如何工作的以及它有什么优势,但是你能解释一下 Haskell 中什么是严格求值吗?我似乎找不到太多关于它的信息,因为惰性评估是最著名的。 他们各自的优势是什么。什么时候真正使

  • haskell - Haskell 中的反向函数行为

    digits :: Int -> [Int] digits n = reverse (x) where x | n digits 1234 = [3,1,2,4]

  • haskell - Haskell 是否支持类型类的匿名实例?

    我在 F# 中有以下代码(来自一本书) open System.Collections.Generic type Table = abstract Item : 'T -> 'U with ge

  • haskell - 使用需要多个输入的过滤器 - Haskell

    我对 Haskell 比较陌生,过去几周一直在尝试学习它,但一直停留在过滤器和谓词上,我希望能得到帮助以帮助理解。 我遇到了一个问题,我有一个元组列表。每个元组包含一个 (songName, song

  • haskell - 或采用两个值参数 haskell

    我是 haskell 的初学者,我试图为埃拉托色尼筛法定义一个简单的函数,但它说错误: • Couldn't match expected type ‘Bool -> Bool’

  • haskell - Haskell 中的读取函数

    我是 Haskell 语言的新手,我在使用 read 函数时遇到了一些问题。准确地说,我的理解是: read "8.2" + 3.8 应该返回 12.0,因为我们希望返回与第二个成员相同的类型。我真正

  • haskell - Haskell 声明中的感叹号是什么意思?

    当我尝试使用真实项目来驱动它来学习 Haskell 时,我遇到了以下定义。我不明白每个参数前面的感叹号是什么意思,我的书上好像也没有提到。 data MidiMessage = MidiMessage

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