确定 elm 脚本中的类型签名
Determine type signature in elm script
由于我正在学习教会编码并试图降低复杂性,所以我使用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
所以在函数思维中使用等式推理,我将类型替换为:
a -> (a -> b) -> b
as
Peano -> (Peano -> (Int -> Int)) -> (Int -> Int)
^ ^
fwd 0
因此,
cExp c3 c3 fwd 0 = 27
可能是什么问题?
我想知道这是一个与 elm
中的无限类型相关的问题,但我没有足够的知识来理解正在发生的事情。
问题是您根据 Int
定义 Peano
,而实际上参数可能是函数。你应该让它更通用:
type alias Peano a = (a -> a) -> a -> a
现在您必须更新您的教会数字:
c3 : Peano a
c3 f =
f >> f >> f
(旁注:Elm 的 >>
运算符是函数组合,但方向相反。使用常规函数组合运算符 <<
可能更惯用,它是相当于 Haskell 的 .
运算符)
你的指数函数可以这样注释:
cExp : a -> (a -> b) -> b
cExp cm cn =
cn cm
由于我正在学习教会编码并试图降低复杂性,所以我使用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
所以在函数思维中使用等式推理,我将类型替换为:
a -> (a -> b) -> b
as
Peano -> (Peano -> (Int -> Int)) -> (Int -> Int)
^ ^
fwd 0
因此,
cExp c3 c3 fwd 0 = 27
可能是什么问题?
我想知道这是一个与 elm
中的无限类型相关的问题,但我没有足够的知识来理解正在发生的事情。
问题是您根据 Int
定义 Peano
,而实际上参数可能是函数。你应该让它更通用:
type alias Peano a = (a -> a) -> a -> a
现在您必须更新您的教会数字:
c3 : Peano a
c3 f =
f >> f >> f
(旁注:Elm 的 >>
运算符是函数组合,但方向相反。使用常规函数组合运算符 <<
可能更惯用,它是相当于 Haskell 的 .
运算符)
你的指数函数可以这样注释:
cExp : a -> (a -> b) -> b
cExp cm cn =
cn cm