【问题标题】:Which Haskell idioms can I use to implement realtime find-as-you-type autocomplete at the command line?我可以使用哪些 Haskell 习语在命令行中实现实时查找自动完成?
【发布时间】:2013-03-09 09:46:26
【问题描述】:

我试图通过在命令行上创建 Notational Velocity 风格的 find-as-you-type 文件搜索来掌握 Haskell 的基础知识。 我没有解决整个问题,而是尝试了一个非常基本的版本: 有一个文件有 10 行,每行一个 3 个字母的单词。在我输入每个字母后,我想根据我目前的输入更新可能包含我正在输入的单词的行号列表的显示。

有人可以演示一个 Haskell 程序吗?我认为我的问题在于强制重新评估每个字符输入。提前一百万谢谢。

【问题讨论】:

  • 这不是关于 Haskell 的能力,而是更多关于命令行的能力。一般来说,我认为您的代码在用户按下 [Enter] 之前无法知道命令行中写入的内容。
  • @KarolisJuodelė 我认为一个程序绝对可以做到这一点 - 例如,Vim 响应单键输入而无需按下 Enter。这样做的方法是从终端一次读取一个字符,然后更新完成或执行一些操作,这取决于按下的键是否被输入,或者可能使用某种库来制作命令行 UI,例如 ncurses(用于许多命令行程序)。
  • @DarkOtter,这就是我说“一般”的原因。我知道它可以通过依赖于平台的库(及其跨平台包装器)来完成。不过,我认为不应该鼓励使用它们——如果你想要一个合适的 UI,请使用合适的 UI 工具包。我担心初学者可能会认为控制台 UI 更容易,而实际上它通常更难。

标签: shell haskell command-line


【解决方案1】:

我不会尝试编写您要求的整个 Haskell 程序,但这里有一个非常简短的示例,显示了您目前声称坚持的一点:每次按键后都做一些事情。我们不会做任何令人兴奋的事情(只需添加一个数字并将其打印出来),但它会展示如何完成这项小任务,您或许可以从那里开始进行 hack。

您真正需要知道但您似乎不需要知道的唯一一件事是您可以关闭输入的行缓冲。

import System.IO

loop n = do
    c <- getChar
    print n
    -- do whatever recalculation you need to do here, using
    -- n (which can be more complicated than an Integer, as
    -- it is here, of course) and c (which is a Char
    -- representing the key the user whacked)
    -- our recalculation is just to increase n by one
    loop (n+1)

main = do
    hSetBuffering stdin NoBuffering -- do this once before anything else
    loop 0

【讨论】:

  • 我只是玩了一下这个,我会做两个笔记。 1)您可能还想关闭标准输出的缓冲。 2) 如果循环太慢,很容易错过输入字符。只需用 (putstr [toUpper c]) 重新打印字符并敲击键盘,您就会明白我的意思。
【解决方案2】:

学习响应式编程可能是一个好的开始。
为此,一个好的图书馆似乎是reactive banana
有一些基础example

如果您想了解更多关于 FRP 的信息,stack 上的一个优秀主题将为您提供一个清晰的概览。

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多