Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Haskell: REPL的for循环

Haskell: REPL的for循环
EN

Stack Overflow用户
提问于 2022-03-02 08:03:17
回答 1查看 128关注 0票数 -3

我试图在Haskell中编写类似于repl的代码,并希望在C中复制这段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (int c = getc(stdin); c != 'e'; c = getc(stdin)) {
        printf("I got %c!\n", c);
}

我可以使用递归,但我害怕增加限制。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-02 10:58:43

你应该使用递归。Haskell被设计成不受限制地处理递归,即使是有效的无限循环(例如,事件处理循环或REPL循环),也可以而且应该使用递归。

因此,您可以大致按照以下方式编写您的程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main = do
  txt <- getLine
  if txt /= "exit" then do
    putStrLn $ "I got " ++ txt ++ "!"
    main
  else do
    return ()

给予:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ./repl
foo
I got foo!
bar
I got bar!
exit
$ 

我编写它是为了抓取整行输入,而不是单个字符,因为当尝试逐字符获取输入时,通常会出现缓冲输入的问题。这种无限递归工作得很好,无论它在退出前处理了多少行,都不会超过任何限制。

在大多数真实世界的程序中,您不希望整个主程序循环,所以通常编写如下所示。在这里,我使用了when,这是编写模式if xxx then yyy else return ()的一种更好的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Control.Monad  -- for definition of "when"

main = do
  -- initialization
  putStrLn $ "Welcome to my REPL!"
  -- start the main loop
  loop
  -- clean up
  putStrLn $ "Thanks so much for using my REPL!"

-- definition of main loop
loop = do
  txt <- getLine
  when (txt /= "exit") $ do
    putStrLn $ "I got " ++ txt ++ "!"
    loop
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71325716

复制
相关文章
jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的。没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧。只是少了VS的Intelligence,有点不习惯罢了。
_淡定_
2018/08/24
1.7K0
springboot中通过main方法调用service或dao
大多数情况下,我们使用springboot是创建一个web项目,然后通过接口访问,但是也有特殊情况,比如线上跑着的web项目,有一些特殊的数据,需要经过计算导入到数据库,这个时候,我们可能需要原来的web项目中的一些service,dao才辅助操作,但是又不能在服务端新开接口。我们通过springboot的main方法执行这些操作。 此时,service和到需要通过上下文获得。
tongyao
2022/06/09
1.1K0
odoo 通过Javascript显示或隐藏form自带按钮
odoo14/custom/estate/static/src/js/hide_or_show_form_button.js
授客
2023/05/24
1.8K0
odoo 通过Javascript显示或隐藏form自带按钮
VisualStudio 通过 EditorBrowsable 隐藏不开放的属性或方法
在开发中,总是会有一些方法不期望让大家直接使用到,就可以通过 EditorBrowsable 特性让智能提示不显示这个属性或方法
林德熙
2022/08/04
4870
VisualStudio 通过 EditorBrowsable 隐藏不开放的属性或方法
在开发中,总是会有一些方法不期望让大家直接使用到,就可以通过 EditorBrowsable 特性让智能提示不显示这个属性或方法
林德熙
2019/03/13
8710
Odoo 通过Javascript调用模型中自定义方法
那问题来了,如果希望在普通的javascript函数中使用上述请求功能,咋办?参考如下示例代码
授客
2023/02/26
1.3K0
jquery中隐藏操作
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>myFirstJquery.html</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> // $(document).ready(function(){ //
闵开慧
2018/03/30
1.3K0
如何通过反射调用对象的方法?
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str));
唐怀瑟
2018/08/30
2.9K0
javascript 之隐藏你的代码
标题里的“短”字加了引号,只是因为它看起来短,实际并不短,因为字节还是在的,在 unicode 里有一种神奇的字符叫 零宽空白,它的特点是字型的显示宽度为 0,无论堆了多少个零宽字符,你都看不见它。
Marco爱吃红烧肉
2021/07/27
1.2K0
如何隐藏tableHeaderView或tableFooterView
在项目中,因为同一页面结构体不同,头部是相同的结构,用了两个不同的tableView,头部是统一的view,但是发现tableView.tableHeaderView=_headerView只赋值一次,不支持来回赋值,打印出 NSLog(@"%@",_headerView.superview)仍然是上一个tableview视图。
honey缘木鱼
2019/11/04
1.1K0
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
本文转载:http://www.csframework.com/archive/2/arc-2-20110805-1771.htm
跟着阿笨一起玩NET
2018/09/18
8.4K0
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
jquery调用页面的方法
本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/05/28/1491250.html
跟着阿笨一起玩NET
2018/09/19
3.1K0
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
在 Java 中如果我们使用 new 关键字调用构造函数对类进行实例化,我们就可以根据在这个类中的修饰符来访问类中定义的非私有方法。但是如果需要在其他类调用私有的方法,就可以利用 Java 中提供的反射来实现。
白鹿第一帅
2022/05/08
2.4K0
Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
Python调用JavaScript代码
在写爬虫经常会遇到很多JS代码,比如说某些参数加密,可以只用用Python来翻译,但是有时候代码不容易阅读(JS渣渣),所以这里直接去找一条捷径,直接用Python的第三方库去调用JS代码。
小歪
2018/10/23
1.6K0
PHP通过反射方法调用执行类中的私有方法
PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。
魏杰
2022/12/23
1.7K0
JavaScript中的链式调用
链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。
WindRunnerMax
2020/11/26
4.1K0
JavaScript中的链式调用
链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。
WindRunnerMax
2020/11/27
9000
点击加载更多

相似问题

有什么简单的方法来写这个吗?

31

有什么简单的方法来测试Python脚本吗?

120

有什么标准的方法来重定向SOAP请求吗?

12

有什么简单的方法来测试python脚本吗?

248

有什么标准的方法来对付鲍尔膨胀吗?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文