算术运算的 Idris 类型派生

Idris type deriving for an arithmetic operation

在下面的代码中

Idris> :t \x => x + x
\x => x + x : Integer -> Integer

Idris 为 x 变量派生了一个 Integer 类型,我认为它应该派生出一个接口限制,如 Haskell:

Haskell> :t (\x y -> x + y)
(\x y -> x + y) :: Num a => a -> a -> a

那么它的行为甚至不像 Integer,接受 Double 类型:

Idris> (\x => x + x) 2.0 
4.0 : Double

谁能给我解释一下?

我认为总的来说,可以说在 idris 的 REPL 中检查类型推断是一个坏主意。 REPL 代码和存在于 Idris 文件中的代码表现不同。

你想要的函数应该写成:

addy: Num a => a -> a -> a
addy x y = x + y

并且会具有与您期望的 Haskell 相似的类型。 Idris 中的类型推断通常非常薄弱(因为它无法确定依赖类型的类型系统)。