为什么 Idris 2 无法解决这个简单示例中函数组合的约束?

Why does Idris 2 fail to resolve constraints with function composition in this trivial example?

我在 Idris 2 中尝试编写的一些代码遇到了问题。我想解决这个问题,但更重要的是,我希望更深入地理解它并发展一些诊断此类问题的技能一般。

我已将问题提炼为以下相对简单的示例:

data D : Nat -> Type where
  V : (n : Nat) -> D n

d : (n : Nat) -> D n
d n = V n

f : D n -> String
f (V n) = show n

t : Nat -> String
t = f . d

t 的定义未能通过以下输出进行类型检查:

Error: While processing right hand side of t. Can't solve constraint between: ?n [no locals in scope] and n.

Test:11:9--11:10
 07 | f : D n -> String
 08 | f (V n) = show n
 09 | 
 10 | t : Nat -> String
 11 | t = f . d

一些实验表明 t 的以下替代定义也无法通过类型检查:

t : Nat -> String
t n = (f . d) n
t : Nat -> String
t = \n => (f . d) n

虽然这些替代类型检查成功:

t : Nat -> String
t n = f (d n)
t : Nat -> String
t = \n => f (d n)

我正在努力学习 Idris(第二次),所以虽然我可以继续使用不涉及函数组合的定义,但我想提高我的理解。

在我看来,通过类型检查的定义只是具有相同语义和行为的语法替代,我不明白为什么函数组合定义无法通过类型检查。我也想了解类型检查器报告的特定错误消息,以便我加深理解并在以后解决类似的类型检查错误。

我有几个广泛的问题:

看看涉及的类型

Prelude.. : (b   -> c     ) -> (a        -> b   ) -> a -> c
f :          D n -> String
d :                             (n : Nat) -> D n

问题是:

(a        -> b   )
(n : Nat) -> D n

无法统一,因为(a -> b)不允许参数的值决定return值的类型。