将 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/