隐式参数的顺序如何影响idris?

时间:2017-10-21 01:18:17

标签: idris

这失败了:

> the ({A : Type} -> A -> {B : Type} -> B -> (A, B)) MkPair
(input):1:5:When checking argument value to function Prelude.Basics.the:
        Type mismatch between
                A -> B1 -> (A, B1) (Type of MkPair)
        and
                A1 -> B -> (A1, B) (Expected type)

        Specifically:
                Type mismatch between
                        Pair A
                and
                        \uv => uv -> uv

这有效:

> ({A : Type} -> {B : Type} -> A -> B -> (A, B)) MkPair
\A1, B1 => MkPair : A -> B -> (A, B)

奇怪的是:

q : {A : Type} -> A -> {B : Type} -> B -> (A, B)
q a b = MkPair a b

> :t q
q : A -> B -> (A, B)

> :t MkPair
MkPair : A -> B -> (A, B)

为什么qMkPair似乎具有相同的类型?他们真的有相同的类型吗?为什么隐式参数的顺序很重要?

1 个答案:

答案 0 :(得分:3)

在某种意义上,隐式参数与非隐式参数没有区别。编译器大部分时间都会为您推断它们,但它们仍然是参数并且必须存在,因为在核心语言的层次上没有隐式参数。你可以要求REPL为你显示暗示:

λΠ> :set showimplicits
λΠ> :t MkPair
Builtins.MkPair : {A : Type} -> {B : Type} -> (a : A) -> (b : B) -> (A, B)
λΠ> :t q
Main.q : {A : Type} -> A -> {B : Type} -> B -> (A, B)

如果在上述类型中用普通括号替换花括号,您会发现MkPairq的类型因参数的顺序不同而不同。