【问题标题】:Weird behaviour of pure from Applicative in GHCiGHCi中Applicative中纯的奇怪行为
【发布时间】:2020-03-08 07:46:19
【问题描述】:

我正在阅读 Scott Wlaschin 的优秀文章 Understanding map and apply 并运行一些 Haskell 代码来理解这些概念(FunctorApplicative、...)。我偶然发现了一个我不理解的行为。

为什么评估pure add1 什么也不打印?评估表达式的值是多少?为什么pure add1 "abc" 把函数add1 还给我?

我知道pure 将一个价值提升到提升的世界(在文章中如此称呼)。由于我没有在某处提供具体的提升值或足够的类型信息,因此类型约束是通用的并且保持Applicative f。因此我了解pure add1 的类型。但这里发生的其他事情让我无法理解。

$ stack ghci
GHCi, version 8.8.2
λ: add1 :: Int -> Int ; add1 x = x + 1
λ: :t add1
add1 :: Int -> Int
λ: add1 100
101
λ: :t pure
pure :: Applicative f => a -> f a
λ: pure add1
λ: :t pure add1
pure add1 :: Applicative f => f (Int -> Int)
λ: pure add1 "abc"

<interactive>:8:1: error:
    • No instance for (Show (Int -> Int)) arising from a use of ‘print’
        (maybe you haven't applied a function to enough arguments?)
    • In a stmt of an interactive GHCi command: print it
λ: :t pure add1 "abc"
pure add1 "abc" :: Int -> Int
λ: pure add1 "abc" 100
101

编辑 我认为@chi 的两个 cmets 和 @sarah 的答案回答了这个问题,因为它显示了 GHCi 选择的应用程序来评估表达式并解释了观察到的行为。

【问题讨论】:

  • 看起来和ghci special case for Applicative?是同一个问题,但它让我无法理解pure add1 "abc"
  • 不,我认为这是一个不同的问题:如果它是相同的,您将拥有pure add1 :: IO (Int -&gt; Int),这不允许您使用pure add1 "abc" 100。但我必须说,这种行为看起来非常奇怪——我当然不知道如何解释它。
  • IO 在 GHCi 中接受特殊处理。您的pure add1 被视为IO (Int -&gt; Int) 类型的值,因此它会运行(无效)。然后不打印其最终结果 (add1),因为它不是 Showable。相比之下,尝试pure "hello",它是一个IO String,它的值在最后打印出来。
  • @chi 如果这是真的,pure add1 "abc" 不会进行类型检查。除了隐含的print it,问题中没有代码涉及IO。看我的回答
  • @sara 当您在 GHCi 中输入 pure add1 时,它会在 IO 中进行解释。当您输入 pure add1 something 时,这将在 (-&gt;) a 应用程序中进行解释。 GHCi 的魔力会尽可能在顶层使用 IO:前者是,后者不是。

标签: haskell ghci applicative


【解决方案1】:

由于您将表达式 pure add1 应用于值 "abc",因此 Applicative 实例被选为 (-&gt;) String 的实例。在那种情况下,pure = const,所以你的最终表达式是const add1 "abc",即add1,它没有 Show 实例!

【讨论】:

  • 好的,我会尝试处理它:-) 请注意,显示错误不是问题,因为它是一个默认情况下没有显示实例的函数。也许我不应该离开它。我的问题是const add1 "abc" 给了add1,你已经回答了。
  • 我想我必须更好地理解类型构造函数才能完全掌握它。但是,您的答案、cmets 和本文中链接的其他答案提供了足够的信息来开始了解正在发生的事情。等我弄清楚后我会编辑我的帖子。
  • 我现在发烧卧床不起,所以我把答案写在了手机上。等我感觉好些后,我可能会尝试详细说明!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
相关资源
最近更新 更多