haskell - Haskell 模式匹配(初级)
问题描述
我必须在 Haskell 中实现一个小程序,根据控制台行中的内容增加/减少结果。例如,如果我们在控制台中有 -a,则结果必须为 0,如果 -b,则结果必须增加 6,依此类推。我必须通过模式匹配来做到这一点。
直到现在我还没有使用过 Haskell,我发现它很难理解。我有这个开始:
import System.Environment
main = getArgs >>= print . (foldr apply 0) . reverse
apply :: String -> Integer -> Integer
我不明白主要是什么。它做了什么,从头到尾反过来,它做了什么?正如我在互联网上所读到的,getArgs 函数为我提供了来自控制台行的值。但是我该如何使用它们呢?Haskell 中是否有类似 for/while 的等效函数?
另外,如果你有一些例子或者可能对我有帮助,我将非常感激。
谢谢!
解决方案
这不是对初学者友好的代码。那里采用了几个快捷方式来保持代码非常紧凑(并且采用无点形式)。编码
main = getArgs >>= print . (foldr apply 0) . reverse
可以展开如下
main = do
args <- getArgs
let reversedArgs = reverse args
result = foldr apply 0 reversedArgs
print result
其结果如下所示。如果命令行参数是,例如args = ["A","B","C"]
,那么我们得到reversedArgs = ["C","B","A"]
,最后
result = apply "C" (apply "B" (apply "A" 0))
因为以这种方式foldr
应用该功能apply
。
老实说,我不确定代码使用的原因reverse
以及foldr
您的任务。我会考虑foldl
(或者,为了提高性能,foldl'
)。
推荐阅读
- python - 在python中单击toast通知时如何执行功能?
- python - Matplotlib 'ValueError:子图的非法参数:(1、5)'
- python - 如何在 Rundeck 选项中使用 optiontype 作为 FILE
- javascript - Apigee Edge 插件访问正文
- php - Laravel:函数期望参数作为数组但仍然抛出错误
- c# - 表达式类,将布尔值更改为字符串比较
- flutter - 列子容器覆盖父容器的全宽
- windows - 查找是否在带有 powershell 的 Windows 10 桌面中安装了包含 20 个应用程序的文本文件中的列表
- c# - UWP 根据单击的按钮更改 SplitView.Pane 内容
- flask - 我的 Heroku Flask Web 应用程序如何支持 N 个用户同时下载图像文件?