一些基本问题,用于将SML代码转换为Haskell .
1)我习惯在SML代码中使用本地嵌入式表达式,例如测试表达式,打印等,它们在加载(评估)代码时对本地测试和输出起作用 . 在Haskell中,获得结果(评估)的唯一方法似乎是在模块中添加代码,然后转到另一个模块中的main并添加一些内容来调用和打印结果 .
这是正确的吗?在GHCi中,我可以输入表达式并查看结果,但这可以自动化吗?每次测试评估都必须进入顶层主要对我来说似乎不方便 - 也许只需要改变我的懒惰模式 .
2)在SML中,我可以对返回的结果进行模式匹配和统一,例如:
val myTag(x)= somefunct(a,b,c);
并在匹配后获得x的值 .
我可以轻松地在Haskell中做类似的事情,而无需编写单独的提取函数吗?
3)如何使用元组参数进行构造函数,即未经证实 .
在SML中:
datatype Thing = Int * Int的信息;
但是在哈斯克尔,我试过了;
数据Thing = Info(Int Int)
哪个失败了 . (“Int应用于类型中的太多参数:一些Int Int”)咖喱版本工作正常,
数据Thing = Info Int Int
但我想要没有咖喱 .
谢谢 .
4 回答
阅读其他答案,我想我可以提供更多的例子和一个建议 .
这就像“让MyTag x = someFunct a b c”的例子,但它是模块的顶层 .
正如您所注意到的,Haskell的顶级可以定义命令,但是由于您的模块已被另一个模块导入,因此无法自动运行任何代码 . 这与Scheme或SML完全不同 . 在Scheme中,文件被解释为逐个表单执行,但Haskell的顶级只是声明 . 因此,库在加载时不能像运行初始化代码那样做正常的事情,它们必须提供“pleaseRunMe :: IO()”类命令来进行任何初始化 .
正如您所指出的,这意味着运行所有测试需要一些样板代码来列出所有测试 . 您可以在hackage的Testing组下查找图书馆以获取帮助,例如test-framework-th .
如果是将调试和跟踪插入纯代码,通常只需要调试 . 要在Haskell中执行此操作,可以使用
Debug.Trace.trace
,in the base package .如果您担心调用函数,Haskell程序将按照依赖顺序从
main
向下计算 . 但是,在GHCi中,您可以导入模块并调用您希望的任何顶级功能 .f x = (x, y) where y = g a b c
或者你的意思是返回一个值或另一个值?然后使用标记的union(sum-type),例如
Either
:使用
(,)
构造函数 . 例如 .虽然更像Haskell将是:
那些应该是实践中严格的领域:
Debug.Trace允许您内联打印调试消息 . 但是,由于这些函数使用
unsafePerformIO
,与SML等按值调用语言相比,它们可能会以意想不到的方式运行 .我认为
@
语法是你在这里寻找的:(t1, t2)
,所以你想要的是:对于#2,是的,Haskell的模式匹配做同样的事情 .
let
和where
都进行模式匹配 . 你可以做要么