首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell最佳实践: Haskeline的早期终止

Haskell最佳实践: Haskeline的早期终止
EN

Stack Overflow用户
提问于 2011-01-22 23:02:15
回答 2查看 565关注 0票数 5

我正在使用哈斯林包,在我做任何事情之前,我都想从命令行中得到三个字符串,我已经想出了一个对我来说似乎很好的解决方案。但我相信会有更好的方法。我正在寻找最佳实践,同时使用Haskeline软件包。请评估以下示例代码的优点:

代码语言:javascript
复制
import System.Console.Haskeline
import Control.Monad.Trans
import Control.Monad.Maybe
import Data.Maybe
import Control.Monad

main :: IO ()
main = runInputT defaultSettings (runMaybeT getStrings) >>= print

getStrings :: MaybeT (InputT IO) (String, String, String)
getStrings = do
   mone <- lift $ getInputLine "food> "
   notNothing mone
   mtwo <- lift $ getInputLine "drink> "
   notNothing mtwo
   mthree <- lift $ getInputLine "dessert> "
   notNothing mthree
   return (fromJust mone, fromJust mtwo, fromJust mthree)
      where
         notNothing a = guard (a /= Nothing)

正如你所看到的,它完成了提前终止的任务,但看起来还是有点令人讨厌。我正在考虑将notNothing和getInputLine转换为一行,如下所示:

代码语言:javascript
复制
mone <- notNothing =<< lift $ getInputLine "food> " -- does not type check

我觉得看上去没那么糟。我认为这是非常清晰和简洁的(虽然它没有输入check,所以我必须编写一个这样的版本)。

然而,这是我想出的最好的方法,我的最后一个问题是:您将如何改进这段代码,使其更整洁、更容易阅读?我走上正轨了吗?

编辑:如果您的守卫不是“/= Nothing”,那么我刚刚发现的一个很好的助手函数是:

代码语言:javascript
复制
myGuard s = guard (someConditionFunc s) >> s

因为这样您就可以编写(正如鲁奇建议的那样):

代码语言:javascript
复制
mone <- myGuard =<< (lift $ getInputLine prompt)

挺酷的。但是,如果您只是与任何东西匹配,那么TomMD的答案会更好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-22 23:14:31

为什么不直接利用fail _ = Nothing作为可能的单曲呢?

代码语言:javascript
复制
mthree <- lift $ getInputLine "dessert> "
notNothing mthree

变成了

代码语言:javascript
复制
Just mthree <- lift $ getInputLine "dessert> "
票数 7
EN

Stack Overflow用户

发布于 2011-01-22 23:16:43

帮助者函数怎么样?

代码语言:javascript
复制
inputLine :: String -> MaybeT (InputT IO) String
inputLine prompt = do
    m <- lift $ getInputLine prompt
    case m of
        Just x -> return x
        Nothing -> mzero

这可以大大缩短使用各种技巧,但我想说清楚。现在您可以忘记getInputLine可能会失败,MaybeT会为您处理这个问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4771199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档