一些基本问题,用于将SML代码转换为Haskell.
1)我习惯于在SML代码中使用本地嵌入式表达式,例如测试表达式,打印等,它们在加载(评估)代码时对本地测试和输出起作用.在Haskell中,似乎获得结果(评估)的唯一方法是在模块中添加代码,然后转到另一个模块中的main并添加一些东西来调用和打印结果.
这是正确的吗?在GHCi中,我可以输入表达式并查看结果,但这可以自动化吗?每次测试评估都要进入顶级主要部分对我来说似乎不方便 - 也许只需要改变我的懒惰范式.
2)在SML中,我可以对返回的结果进行模式匹配和统一,例如
Run Code Online (Sandbox Code Playgroud)val myTag(x) = somefunct(a,b,c);
并在匹配后获得x的值.
我可以轻松地在Haskell中做类似的事情,而无需编写单独的提取函数吗?
3)如何使用元组参数进行构造函数,即未经证实.
在SML中:
数据类型Thing = Int*Int的信息;
但是在哈斯克尔,我试过了;
数据Thing = Info(Int Int)
哪个失败了.("Int应用于类型中的太多参数:一些Int Int")curried版本工作正常,
数据Thing = Info Int Int
但我想要没有咖喱.
谢谢.
如果是将调试和跟踪插入纯代码,通常只需要进行调试.要在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)
使用(,)构造函数.例如
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)
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |