haskell - Haskell 中的 Floating (a -> a), Num (a -> a -> a) 等

标签 haskell

在 ghci 中,:t 命令在诸如 3 4(sin . (+)) 1 2 3 4 这样的表达式中没有发现任何错误, 罪过。 (+) 1 2 3 4(-) - (-) 并愉快地为它们提供类型信息:

3 4 :: (Num (a -> t), Num a) => t

sin . (+) 1 2 3 4
  :: (Floating c, Num (a1 -> a2 -> a -> c), Num a1, Num a2) => a -> c

(sin . (+)) 1 2 3 4
  :: (Floating ((a -> a1 -> t) -> a -> a1 -> t), Num (a -> a1 -> t),
      Num a, Num a1) =>
     t

(-) - (-) :: (Num (a -> a -> a), Num a) => a -> a -> a

我相信这背后是有原因的。但我很难想象 (3 4) 有意义的上下文(我不是指实用的东西,而是至少可以编译的东西),如果有人给我线索,我将不胜感激。

最佳答案

很多东西都带有疯狂或不可能的推断约束“类型检查”。我们有 map::(a -> b) -> [a] -> [b] 而不仅仅是严格更通用的 fmap::Functor f => ( a -> b) -> f a -> f b 是如果你不正确地使用后者,你很可能会得到一个错误 No instance (Functor [something obviously not a functor]) 而不是更友好的 Expecting [a], got ...

Num/Floating 的情况尤其令人不安,因为所有数字文字都使用类型类进行了重载。编译器会愉快地为任何整数文字推断出几乎任何类型,如果可能的话,只需将其作为约束。通常这最终会导致实例解析错误。

此外,可以编写一个并非完全无意义的instance Num b => Num (a -> b)That's a different question, though.正如我在那里指出的那样,我觉得这是一个有问题的想法,而且它有意不在 base 中。 (或者,就此而言,我查看的替代数字类型类包。)

关于haskell - Haskell 中的 Floating (a -> a), Num (a -> a -> a) 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696105/

相关文章:

haskell - 有reactive-banana-gtk吗?

haskell - 丢弃 (>>) 翻转的一元组合

haskell - Cabal 沙箱用于测试 hackage 上的软件包,需要我没有的基础版本

ghci - 对空列表的 head 和 tail 调用会引发异常

haskell - 容器 "C a"是否有一个名称,它保存 "a"或返回类型 "C a"的值的函数?

haskell - Data.Text 与 Rope

haskell - 为什么当行尾序列是 CRLF 时这个解析器总是失败?

haskell - 有没有直接的方法将多个记录字段的 setter 组合到一个 setter ?

http - 如何使用 Network.HTTP.receiveHTTP 在 Haskell 中编写一个简单的 HTTP 服务器

haskell - Haskell 中的字节串 : should I use Put or Builder?