SML转换为Haskell

gut*_*rie 3 haskell sml

一些基本问题,用于将SML代码转换为Haskell.
1)我习惯于在SML代码中使用本地嵌入式表达式,例如测试表达式,打印等,它们在加载(评估)代码时对本地测试和输出起作用.在Haskell中,似乎获得结果(评估)的唯一方法是在模块中添加代码,然后转到另一个模块中的main并添加一些东西来调用和打印结果.

这是正确的吗?在GHCi中,我可以输入表达式并查看结果,但这可以自动化吗?每次测试评估都要进入顶级主要部分对我来说似乎不方便 - 也许只需要改变我的懒惰范式.

2)在SML中,我可以对返回的结果进行模式匹配和统一,例如

val myTag(x) = somefunct(a,b,c);
Run Code Online (Sandbox Code Playgroud)

并在匹配后获得x的值.

我可以轻松地在Haskell中做类似的事情,而无需编写单独的提取函数吗?

3)如何使用元组参数进行构造函数,即未经证实.
在SML中:

数据类型Thing = Int*Int的信息;

但是在哈斯克尔,我试过了;

数据Thing = Info(Int Int)

哪个失败了.("Int应用于类型中的太多参数:一些Int Int")curried版本工作正常,

数据Thing = Info Int Int

但我想要没有咖喱.

谢谢.

Don*_*art 5

  • 这个问题有点不清楚 - 你问的是如何评估Haskell中的函数?

如果是将调试和跟踪插入纯代码,通常只需要进行调试.要在Haskell做到这一点,你可以使用Debug.Trace.trace,在基本包.

如果您担心调用函数,Haskell程序将main按照依赖顺序从下向评估.但是,在GHCi中,您可以导入模块并调用您希望的任何顶级函数.

  • 如果您愿意,可以将原始参数返回给函数,方法是将其作为函数结果的一部分,例如使用元组:

    f x = (x, y) where y = g a b c

或者你的意思是返回一个值或另一个值?然后使用标记联合(sum-type),例如Either:

f x = if x > 0 then Left x
                else Right (g a b c)
Run Code Online (Sandbox Code Playgroud)
  • 如何使用元组参数进行构造函数,即在SML中不受限制

使用(,)构造函数.例如

 data T = T (Int, Int)
Run Code Online (Sandbox Code Playgroud)

虽然更像Haskell将是:

 data T = T Int Bool
Run Code Online (Sandbox Code Playgroud)

那些应该是实践中的严格领域:

 data T = T !Int !Bool
Run Code Online (Sandbox Code Playgroud)