算术运算的 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 中的类型推断通常非常薄弱(因为它无法确定依赖类型的类型系统)。
在下面的代码中
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 中的类型推断通常非常薄弱(因为它无法确定依赖类型的类型系统)。