Types 确定elm脚本中的类型签名

Types 确定elm脚本中的类型签名,types,functional-programming,elm,Types,Functional Programming,Elm,由于我正在学习church编码并试图降低复杂性,因此我使用elm来实现代码。但我遇到了一个问题,就是我无法理解类型签名 type alias Peano = (Int -> Int) -> Int -> Int fwd : Int -> Int fwd x = x + 1 c3 : Peano c3 f = f >> f >> f cExp: ??? cExp cm cn = cn cm 但是,在elm repl >

由于我正在学习church编码并试图降低复杂性,因此我使用
elm
来实现代码。但我遇到了一个问题,就是我无法理解类型签名

type alias Peano = (Int -> Int) -> Int -> Int

fwd : Int -> Int
fwd x = x + 1

c3 : Peano
c3 f = 
    f >> f >> f

cExp: ???
cExp cm cn =
    cn cm
但是,在
elm repl

> cExp cm cn = cn cm
<function> : a -> (a -> b) -> b
> cExp c3
<function> : (((a -> a) -> a -> a) -> b) -> b
> cExp c3 c3
<function> :  (a -> a) -> a -> a
> cExp c3 c3 fwd
<function> : number -> number
> cExp c3 c3 fwd 0
27 : number
所以,

cExp c3 c3 fwd 0 = 27
有什么问题吗


我想知道这是一个与
elm
中的无限类型相关的问题,但我没有足够的知识来理解正在发生的事情。

问题是,您正在用
Int
定义
Peano
,而实际上参数可以是函数。您应该使其更通用:

键入别名Peano a=(a->a)->a->a
现在您必须更新您的教堂数字:

c3:Peano a
c3 f=
f>>f>>f
(旁注:Elm的
>
运算符是函数合成,但方向相反。使用常规函数合成运算符

cExp c3 c3 fwd 0 = 27