gpt4 book ai didi

haskell - Haskell、Ocaml、Javascript 中的语句与表达式

转载 作者:行者123 更新时间:2023-12-05 08:23:06 24 4
gpt4 key购买 nike

据我所知,在 Haskell 中,没有语句,只有表达式。也就是说,与 Javascript 这样的命令式语言不同,您不能简单地逐行执行代码,即

let a = 1
let b = 2
let c = a + b
print(c)

相反,一切都是表达式,没有任何东西可以简单地修改状态并且不返回任何东西(即语句)。最重要的是,所有内容都将包装在一个函数中,这样,为了模仿上述操作,您将使用 monadic do 语法,从而隐藏底层的嵌套函数。

这在 OCAML/F# 中是否相同,还是您可以只使用命令式语句?

最佳答案

这是一个有点复杂的话题。从技术上讲,在 ML 风格的语言中,一切都是表达式。但是,有一些语法糖可以使它读起来更像语句。例如,您在 F# 中提供的示例将是:

let a = 1
let b = 2
let c = a + b
printfn "%d" c

但是,编译器会默默地为您将这些“语句”转换为以下表达式:

let a = 1 in
let b = 2 in
let c = a + b in
printfn "%d" c

现在,这里的最后一行将执行 IO,与 Haskell 不同,它不会将表达式的类型更改为 IO。这里表达式的类型是unitunit 是 F# 在类型系统中表达“这个函数实际上没有结果”的方式。当然,如果函数没有结果,在纯函数式语言中调用它是没有意义的。调用它的唯一原因是一些副作用,并且由于 Haskell 不允许副作用,他们使用 IO monad 来编码函数具有 IO 产生副作用的事实进入类型系统。

F# 和其他基于 ML 的语言确实允许像 IO 这样的副作用,所以它们有 unit 类型来表示只产生副作用的函数,比如打印。在设计您的应用程序时,您通常希望避免使用 unit 返回函数,除了日志记录或打印之类的东西。如果您愿意,您甚至可以使用 F# 的 moand-ish 功能,计算表达式,为您封装副作用。

关于haskell - Haskell、Ocaml、Javascript 中的语句与表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com