gpt4 book ai didi

haskell - 如果我可以使用 "equations",为什么要使用 case 表达式?

转载 作者:行者123 更新时间:2023-12-01 07:13:58 27 4
gpt4 key购买 nike

我正在从“真实世界 Haskell”一书中学习 Haskell。在第 66 页和第 67 页,他们用这个例子展示了 case 表达式:

fromMaybe defval wrapped =
case wrapped of
Nothing -> defval
Just value -> value

我记得在 F# 中有类似的事情,但是(如本书前面所示)Haskell 可以将函数定义为一系列方程;而 AFAIK,F Sharp 则不能。所以我试图以这样的方式定义它:
fromMaybe2 defval Nothing = defval
fromMaybe2 defval (Just value) = value

我将它加载到 GHCi 中,经过几次结果后,我说服自己它是一样的。这让我想知道,为什么在方程时应该有 case 表达式:
  • 更容易理解(是数学;为什么使用 case something of ,谁说的?);
  • 不那么冗长(2 对 4 行);
  • 需要更少的结构和语法糖(-> 可能是一个运算符,看看他们做了什么!);
  • 仅在需要时使用变量(在基本情况下,例如 wrapped 只占用空间)。

  • case 表达式有什么好处?它们的存在仅仅是因为类似的基于 FP 的语言(例如 F#)有它们吗?我错过了什么吗?

    编辑:

    我从@freyrs 的回答中看到,编译器使这些完全相同。所以,方程总是可以变成 case 表达式(如预期的那样)。我的下一个问题是相反的;可以走编译器的相反路线并使用 let 的方程吗?/ where表达式来表达任何大小写表达式?

    最佳答案

    这来自具有小型“内核”面向表达式的语言的文化。 Haskell 源自 Lisp 的根(即 lambda calculuscombinatory logic );它基本上是 Lisp 加上语法加上显式数据类型定义加上模式匹配减去突变加上懒惰评估(懒惰评估本身首先在 Lisp AFAIK 中描述;即在 70-s 中)。

    类似 Lisp 的语言是面向表达式的,即一切都是表达式,语言的语义是作为一组归约规则给出的,将更复杂的表达式变成更简单的表达式,最终变成“值”。

    方程不是表达式。几个方程可以以某种方式混合成一个表达式;你必须为此引入一些语法; case是那种语法。

    Haskell 的丰富语法被翻译成更小的“核心”语言,即 case作为其基本构建块之一。 case必须是一个基本的结构,因为 Haskell 中的模式匹配是该语言的一个基本的核心特性。

    对于您的新问题,是的,您可以通过引入 Luis Casillas 所示的辅助功能 in his answer ,或者使用模式保护,所以他的例子变成:

    foo x y | (Meh o p) <- z = baz y p o
    | (Gah t q) <- z = quux x t q
    where
    z = bar x

    关于haskell - 如果我可以使用 "equations",为什么要使用 case 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765051/

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