haskell - SML 到 Haskell 的转换

标签 haskell sml

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

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

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

val myTag(x) = somefunct(a,b,c);

并在匹配后获取 x 的值。

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

3) 如何使用元组参数(即非柯里化(Currying))创建构造函数。
在 SML 中:

datatype Thing = Info of Int * Int;

但是在 Haskell 中,我尝试过;

data Thing = Info ( Int Int)

失败了。 (“Int 应用于类型中的参数太多:一些 Int Int”) 柯里化(Currying)版本工作正常,

data Thing = Info Int Int

但我想要非柯里化(Currying)。

谢谢。

最佳答案

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

如果是将调试和跟踪插入到纯代码中,则通常仅在调试时需要。要在 Haskell 中执行此操作,您可以使用 Debug.Trace.trace,in the base package .

如果您担心调用函数,Haskell 程序会按照依赖顺序从 main 向下计算。但是,在 GHCi 中,您可以导入模块并调用您想要的任何顶级函数。

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

    f x = (x, y) 其中 y = g a b c

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

f x = if x > 0 then Left x
                else Right (g a b c)
  • 如何使用元组参数创建构造函数,即在 SML 中未柯里化(Currying)

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

 data T = T (Int, Int)

虽然更像Haskell:

 data T = T Int Bool

这些在实践中可能应该是严格的领域:

 data T = T !Int !Bool

关于haskell - SML 到 Haskell 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600246/

相关文章:

list - 证明流的平等

haskell - 为什么 6/length [1, 2, 3] 在 Haskell 中不起作用

sml - 什么是 ML 中高阶函数中的 curry 和 uncurry

c - 在 ghci 中导入 inline-c 模块

performance - 调试HXT性能问题

haskell - Haskell(数据)构造函数构造什么?

list - SML:具有多个输出的函数

closures - 函数闭包与延续,一般和 SML

SML/NJ 使用 CM.make : "Error: illegal character"

SML 运算符和操作数不一致