【问题标题】:Just and dot in winghciJust and dot in winghci
【发布时间】:2014-02-15 20:00:50
【问题描述】:

为什么会这样......

Just.(+3) $ 6.7
Just $ truncate 8.9

...但不是这个?

Just.truncate $ 8.9

我尝试将截断解析为一个简单的 Double -> Int:

let f :: Double -> Int; f = (\ x -> truncate x);

...但这似乎不是问题...

Just.f $ 5.6

<interactive>:41:1:
Failed to load interface for `Just'
Use -v to see a list of the files searched for.

非常感谢!

【问题讨论】:

    标签: haskell pointfree maybe


    【解决方案1】:

    当你的意思是编写函数时,最好写f . g而不是f.g。它更具可读性,并且您可以避免像这样的一堆问题。

    当你在 Haskell 中有 Foo.barFoo.Bar 形式的东西时,它会被解析为限定名。这就是 Just.f 不起作用的原因:Just 不是模块,因此无法加载 Just 的“接口”。

    为什么Just.(+3) 能按预期工作:(+3) 是一个正确的部分,而不是一个标识符,所以点不能是限定名称的一部分。解释它的唯一方法是假设. 是运算符(.) 的中缀应用,所以它一定是Just . (+3)

    【讨论】:

    • 对那个正确的部分很感兴趣,我想知道为什么它会自己工作!
    • 基本上,这是 Haskell 语法中非常多毛的部分,已经成为“必要的邪恶”。原始语言没有限定名称,也没有预见到这个问题。
    • @jpaugh:我认为如果没有人坚持层次分隔符应该是.,我认为它没有是必要的(无论如何,IMO 对 Haskell 来说是一个糟糕的选择,因为. 对于真正完全不同的东西来说是如此普遍)。如果它是/至少是合理的,因为 UNIX 文件系统与大多数 Haskell 项目的关系比任何使用. 进行方法/结构成员限定的语言更多),那么我们不会有这个麻烦:一个没有参数的 ADT 构造函数的类型实际上没有太多有用的Fractional 实例!
    • 嗯。 / 是合理的,但非常奇特。 (developer 混淆的机会更多,而不是编译器。)嗯,他们肯定不会选择 ::,这是肯定的。
    • 当我们这样做的时候,我们应该交换 ::: ;)
    【解决方案2】:

    大写标识符和另一个标识符之间的点被解析为限定名称(例如Data.Map.insert),因此错误告诉您它找不到名为Just 的模块。您只需在点周围添加空格即可解决此问题。

    【讨论】:

      猜你喜欢
      • 2022-12-26
      • 2022-12-27
      • 2021-09-02
      • 2011-11-05
      • 2022-08-16
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多