【问题标题】:Pattern matching in GHCiGHCi 中的模式匹配
【发布时间】:2013-03-31 18:59:23
【问题描述】:

在学校练习

我有这个功能

bar :: Float -> Float -> Float
bar x 0 = 0
bar 0 y = 0
bar x y = x * y 

我在 GHC 中输入为

let bar x 0 = 0; bar 0 y = 0; bar x y = x * y

并评估

bar foo 0
bar 0 foo

我被要求修改 bar 以使用 '|'所以我想做类似的事情:

let bar x y = | x 0 = 0 | 0 y = 0 | x y = x * y

但是在 ghci 中我得到了

parse error on input '='

如何在 GHCi 中做到这一点? 使用模式匹配 ('|') 会改变什么吗?

【问题讨论】:

  • 您原来的bar 使用模式匹配。你想了解guards
  • 你可以特别聪明,写简单let bar | otherwise = (*)...
  • 去掉=第一个守卫之前的let bar x y | x == 0 = ... | y == 0 = ... | otherwise = ...
  • @leftaroundabout 挑剔:这假定Num 实例的某些属性并不总是成立。例如,(1/0 :: Double) * 0 /= 0
  • @ThomasM.DuBuisson:是的,当然,或者last[1..] * 0 ≡ ⟂。我真的不是认真的。

标签: haskell


【解决方案1】:

查看使用守卫的语法:

bar x y | x == 0     = 0
        | y == 0     = 0
        | otherwise  = x * y

在 GHCi 中写在一行上:

let bar x y | x == 0 = 0 | y == 0 = 0 | otherwise = x * y

【讨论】:

    【解决方案2】:

    使用文件

    除非真的是单行代码,否则不要将代码直接输入到 ghci 中。

    将您的代码保存在名为 PatternMatch.hs 的文本文件中,然后通过键入将其加载到 ghci 中。

    :l PatternMatch.hs
    

    然后,如果您进行更改(并保存),您可以通过键入在 ghci 中重新加载文件

    :r
    

    或者,您可以在它们所在的练习之后命名您的文件,或者如果它确实是一次性代码,则只需一个可重用的 Temp.hs。

    通过将内容保存在文本文件中,您可以更轻松地对其进行编辑和重复使用。

    模块

    稍后您将使用适当的模块将相关函数收集在一起,以便将它们导入到其他程序中。例如,您可以拥有

    module UsefulStuff where
    
    pamf = flip fmap
    

    保存在名为 UsefulStuff.hs 的文件中,然后您可以保存在另一个文件中

    import UsefulStuff
    

    然后使用 UsefulStuff 中的函数。

    模块对于你现在所做的事情来说太过分了,但是获得编辑、保存、重新编译、测试、重复的工作流程,你会省去很多努力。

    【讨论】:

    • 欢迎来到 21 世纪。文件属于带黄铜把手的柜子。在当今这个时代,酷孩子们在 JSFiddle 中敲打他们的代码并突然按下运行按钮或在 Swift 沙箱中涉猎以获得即时满足感,这个答案不会赢得许多潜在的 Haskell 程序员。真正酷的孩子们可能会前往Shen,在那里他们可以拥有他们想要的所有函数式编程和类型检查优势,然后是一些。哦,是的,它有一个 REPL,它允许“开箱即用”的多行输入、类型签名等等。
    • @ack 我认为你误认为我是一个关心酷孩子做什么的人,而我实际上只关心帮助人们充分利用我也使用的工具。感谢您发送有关虚假的垃圾邮件。
    • 如果你这么在意,也许你可以参考this answer,它不需要使用文件。
    • @ack 老实说,我认为很酷的孩子会努力构建任何不平凡的东西,除非他们准备在某些文件中保存一些代码。如果您通过说您不需要保存任何工作来宣传您最喜欢的语言,我担心您最终会将它作为不适合认真开发的玩具语言出售。无论如何,我认为整个评论对话都是题外话。
    【解决方案3】:

    GHCi 允许通过在解释器中输入:set +m 来进行多行输入。详情请见Multiline input section

    这是一个演示它的示例:

    GHCi, version 8.8.3: https://www.haskell.org/ghc/  :? for help
    Prelude> :set +m
    Prelude> { incList [] = []
    Prelude| ; incList (x:xs) = x+1:incList xs
    Prelude| }
    Prelude> incList [40, 41, 42]
    [41,42,43]
    Prelude>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2012-10-31
      相关资源
      最近更新 更多