簡體   English   中英

為什么`(\\ xy - > x + y)@Integer`失敗,但`(+)@ Integer`成功了?

[英]Why does `(\x y -> x + y) @Integer` fails, but `(+) @Integer` succeeds?

考慮:

λ :type (+) @Integer
(+) @Integer :: Integer -> Integer -> Integer




λ :type (\x y -> x + y) @Integer
...
...error...
...Cannot apply expression...
...

λ f = (+)
λ :type f @Integer
...
...error...
...Cannot apply expression...
...

λ g = \x y -> x + y
λ :type g @Integer
...
...error...
...Cannot apply expression...
...

λ h x y = x + y
λ :type h @Integer
...
...error...
...Cannot apply expression...
...

與此同時:

λ :type (+)
... :: Num a => a -> a -> a

λ :type (\x y -> x + y)
... :: Num a => a -> a -> a

λ :type f
... :: Num a => a -> a -> a

λ :type g
... :: Num a => a -> a -> a

λ :type h
... :: Num a => a -> a -> a

因此,即使這些對象的類型沒有區別,它們看起來與類型應用程序不同。

  • 為什么?
  • 我錯過了一些明顯的東西嗎
  • 這是一個錯誤嗎?
  • 這是一個功能嗎?
  • 這種語言設計不好嗎?
  • 這是偉大的語言設計嗎?

在大多數情況下,類型應用程序只能在存在顯式類型簽名時應用。 引用GHC文件:

如果該函數是標識符(通用情況),則僅當標識符已被賦予類型簽名時才認為其類型是已知的。

為什么?

我猜這種設計是存在的,因為當你有明確的簽名時,類型變量的順序是很好的定義。

我錯過了一些明顯的東西嗎

由您決定以上是多么明顯。 您可以深入思考文檔和設計討論,以查看對話的演變,但參數的順序,當類型應用程序只能嚴格按順序完成時,似乎跳出來作為一個問題。

這是一個錯誤嗎?

我不相信。 也許對於lambda案。

這是一個功能嗎?

一致性良好的特征。

這種語言設計不好嗎? 這是偉大的語言設計嗎?

也許更好的語言設計是允許簡單的例子,例如你的,在沒有可能的歧義時工作(類型參數順序是隱含的,因為只有一個類型參數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM