首页 文章

SML转换为Haskell

提问于
浏览
3

一些基本问题,用于将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 回答

  • 4

    阅读其他答案,我想我可以提供更多的例子和一个建议 .

    data ThreeConstructors = MyTag Int | YourTag (String,Double) | HerTag [Bool]
    
    someFunct :: Char -> Char -> Char -> ThreeConstructors
    
    MyTag x = someFunct 'a' 'b' 'c'
    

    这就像“让MyTag x = someFunct a b c”的例子,但它是模块的顶层 .

    正如您所注意到的,Haskell的顶级可以定义命令,但是由于您的模块已被另一个模块导入,因此无法自动运行任何代码 . 这与Scheme或SML完全不同 . 在Scheme中,文件被解释为逐个表单执行,但Haskell的顶级只是声明 . 因此,库在加载时不能像运行初始化代码那样做正常的事情,它们必须提供“pleaseRunMe :: IO()”类命令来进行任何初始化 .

    正如您所指出的,这意味着运行所有测试需要一些样板代码来列出所有测试 . 您可以在hackage的Testing组下查找图书馆以获取帮助,例如test-framework-th .

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

    如果是将调试和跟踪插入纯代码,通常只需要调试 . 要在Haskell中执行此操作,可以使用 Debug.Trace.tracein the base package .

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

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

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

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

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

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

    data T = T (Int, Int)
    

    虽然更像Haskell将是:

    data T = T Int Bool
    

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

    data T = T !Int !Bool
    
  • 5
    • Debug.Trace允许您内联打印调试消息 . 但是,由于这些函数使用 unsafePerformIO ,与SML等按值调用语言相比,它们可能会以意想不到的方式运行 .

    • 我认为 @ 语法是你在这里寻找的:

    data MyTag = MyTag Int Bool String
    
    someFunct :: MyTag -> (MyTag, Int, Bool, String)
    someFunct x@(MyTag a b c) = (x, a, b, c) -- x is bound to the entire argument
    
    • 在Haskell中,元组类型用逗号分隔,例如 (t1, t2) ,所以你想要的是:
    data Thing = Info (Int, Int)
    
  • 1

    对于#2,是的,Haskell的模式匹配做同样的事情 . letwhere 都进行模式匹配 . 你可以做

    let MyTag x = someFunct a b c
    in ...
    

    要么

    ...
    where MyTag x = someFunct a b c
    

相关问题