- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的程序,只需从用户处获取一个字符串和一个 key ,并使用凯撒密码函数对该字符串进行加密。该函数本身可以工作,所以我不会展示其来源。问题是,当编译器编译程序时,它将允许我输入所有 getLines,然后在输入所有内容后,程序将打印所有 putStr 和 putStrLn 然后关闭。仅当程序使用“runhaskell”执行或编译并作为 exe 执行时才会发生这种情况,即。不在解释器中。程序如下:
main = do
choice <- prompt "Would you like to encrypt (1) or decrypt (2)? "
if choice == "1" then do
encrypt <- prompt "Enter code for encryption: "
k <- prompt "Enter key for the code: "
let key = read k in
putStrLn ("Encrypted message: " ++ (caesar key encrypt) ++ "\n")
else do
decrypt <- prompt "Enter code for decryption: "
k <- prompt "Enter key for the code: "
let key = read k in
putStrLn ("Decrypted message: " ++ (caesar (-key) decrypt) ++ "\n")
getLine
prompt str = do
putStr str
getLine
在解释器中运行时的输出:
Prelude Main> main
Would you like to encrypt (1) or decrypt (2)? 1 <- the one is user input
Enter code for encryption: Hello world <- user input
Enter key for the code: 2 <- user input
Encrypted message: Jgnnq"yqtnf <- program output
编译后执行时的输出:
1 <- user has to input before the console is printed out
Hello world <--┘
2 <--┘
Would you like to encrypt (1) or decrypt (2)? Enter code for encryption: Enter key for the code: Encrypted message: Jgnnq"yqtnf
我忽略了 putStrLn 和 putStr 的某些内容吗?它们仅作为函数或其他内容的结果执行吗?
此外,我创建的“提示”函数不是问题,因为我用各自的 putStr 和 getLine 替换了所有提示的使用,但它仍然做了同样的事情。
最佳答案
runhaskell
和ghci
旨在尽快启动您的程序,而不强调运行程序的效率。因此,与 ghc
相比,他们做出了许多次优效率决策。 ,这里让您感到困扰的是它们默认情况下不对标准输入或输出使用缓冲,而 ghc
默认情况下使用更有效的行缓冲。因为您从未在 prompt
期间打印结束行s,在编译版本中,缓冲区不会向用户显示...直到到达 putStrLn
在程序末尾打印行结束符,并立即显示整个缓冲区。
你有一些选择:
System.IO
并使用hSetBuffering stdout NoBuffering
main
开头.System.IO
并使用hFlush stdout
每次调用 getLine
之前.putStrLn
而不是putStr
无处不在。关于Haskell 将 putStr 和 putStrLn 放在程序末尾而不是在执行期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993991/
如何使用 putStr 和 map 输出字符串列表?我想做一些类似的事情: s=["test1","test2"] map putStr s 但是没有使用 monad 的经验,也不知道如何正确使用..
我正在尝试以这种格式打印出整数列表 [1] [2] [3] 所以我的函数接受一个整数列表并返回一个 IO () ,如下所示: import System.IO printVector :: [Inte
我有一个定义如下的 POJO 对象: public class MYPOJO implements Serializable { int myint; String mystring;
这个问题在这里已经有了答案: Wrong IO actions order using putStr and getLine (1 个回答) 关闭 5 年前。 当我想在读取 Haskell 中的输入
这个问题在这里已经有了答案: Wrong IO actions order using putStr and getLine (1 个回答) 关闭去年。 我是从 Learn You a Haskel
这个问题已经有答案了: IO happens out of order when using getLine and putStr (3 个回答) 已关闭 9 年前。 假设我们有一个简短的 haske
我最近开始使用 Android Studio 3.1.2 和 SDK 19 编写我真正的第一个 android 项目。 我目前正在为我的组件编写单元测试,并使用 Mockito 模拟依赖于 Andro
我正在尝试使用新方法 putString 上传 base64 图像。我已经更新到 3.3,但 TS 说 Property putString does not exist on type Refere
我需要将 2 个变量从一个 Activity 传递到另一个 Activity 。 第一个 Activity 我有以下内容: @Override public boolean onContextItem
我有一个简单的程序,只需从用户处获取一个字符串和一个 key ,并使用凯撒密码函数对该字符串进行加密。该函数本身可以工作,所以我不会展示其来源。问题是,当编译器编译程序时,它将允许我输入所有 getL
我正在 Android Studio 1.1.0 中处理 Android 项目,我无法将消息传递给具有 Bundle 类的处理程序。 好吧,这是我的代码 ... Bundle mUIMessageBu
var storageRef = firebase.storage().ref(); var ref = storageRef.child('nothing.txt'); ref.putString(
每次我的应用程序启动时,我都会加载相同的基本共享首选项。 用户可以选择添加自己的条目,效果很好。 我想确保首选项文件不只是添加大量重复项,我假设如果它找到确切的条目,它将跳过 putString 命令
我的 ionic 2 应用程序中有一个简单的功能,可以将文件上传到我的 firebase 存储服务器。它从相机中获取图像的 base64 编码字符串,但当我不尝试强制使用 content-type 时
本文整理了Java中com.zx.zxutils.util.ZXSharedPrefUtil.putString()方法的一些代码示例,展示了ZXSharedPrefUtil.putString()的
假设您使用 putStr 的组合提示用户输入和 getLine : main = do putStrLn "A line with line termination" -- printed c
我是 Haskell 的新手,我想知道如何在 Haskell 中打印两个函数的结果,我会在 C++ 中这样做: cout Int square x = x * x fib :: Int -> Int
代码如下: package com.androidbook.triviaquiz; import android.app.Activity; import android.content.Shared
有了这个文件: main = do putStr "Input: " s <- getLine putStr s 它在 GHCi 中完成了我想要的操作,即将提示放在与提示相同的行上,然后允
我设置此线程是为了阐明 firebase 存储 putString 方法在 React-native 中是否或不是否有效. 根据我的搜索,目前无法使用 put 方法将文件或 Blob 类型上传到 Fi
我是一名优秀的程序员,十分优秀!