Functional programming 我如何获得这个(Miranda函数式编程)的类型定义?

Functional programming 我如何获得这个(Miranda函数式编程)的类型定义?,functional-programming,Functional Programming,rcons s f z=f(s:z) 我需要得到上面的类型定义,我很难弄清楚怎么做。从开始:-它暗示如果s::a那么z:[a]-现在f需要f:[t]->b 答案是 recons :: a -> ([a] -> b) -> [a] -> b ^ ^^^^^^^^^^ ^^^ ^ from s from f z result of f 一步一步地 如果给你这样的练习,你首先要确定从

rcons s f z=f(s:z)


我需要得到上面的类型定义,我很难弄清楚怎么做。

开始:
-它暗示如果
s::a
那么
z:[a]
-现在
f
需要
f:[t]->b


答案是

recons :: a  -> ([a] -> b)  -> [a]  -> b
          ^     ^^^^^^^^^^     ^^^     ^
        from s   from f         z   result of f

一步一步地 如果给你这样的练习,你首先要确定从哪里开始

功能 一个显而易见的地方是找到函数的基本签名

请看一下
rcons s f z=…
这告诉您定义了一个函数(名为
rcons
),该函数包含3个参数(
s
f
z
)-基本参数是:

rcons :: a -> b -> c -> d
请注意,您对这些类型一无所知,因此只需为它们指定所有不同的名称(包括返回类型
d

看看RHS 现在让我们更仔细地看一下右边:首先看到的是
f(…)
,因此似乎
f
本身就是一个应用于括号中内容的函数

这说明
f
本身的形式是
f::r->s
,因此上面的
b
类型是
b~r->s

现在,如果我们替换这个,我们就处于

rcons :: a -> (r -> s) -> c -> d
请注意,
f
是您在
rcons
中做的最后一件事?当然,这意味着
rcons
的结果类型
d
必须与
f
s~d
)的结果类型相同,并且

rcons :: a -> (r -> d) -> c -> d
f
在括号内,您可以看到cons操作
,对于某些
t
,它的类型为
t->[t]
——如果您将其与插入的内容进行比较:
s::a
z::c
您可以看到
t~a
[t]~c
,但是如果
t~a
[t][a]
所以现在
c~[a]
你有

rcons :: a -> (r -> d) -> [a] -> d
你也知道
s:z
的类型-它也是
[a]
(cons的结果)

回到f 既然您对
f
的输入类型有了更多的了解,您就有了
r~[a]
,因为
f
的输入类型必须与您给出的类型相匹配`

你以

 rcons :: a -> ([a] -> d) -> d

在这一点上,我们使用了我们无法继续的所有信息-我会把它称为一天,并将其推广到答案中

*->(*->[*]->[*])->[*]->[*])->[*]->[*]。。。你要的是类型。。。我确实给了你几乎完整的答案-你只需要收集零件并将它们按正确的顺序放入
->
就可以从问题中分辨出f接受a型数组并返回不是b型数组的东西吗?f也不接受2个参数s和z吗?@user63377没有数组
s:z
是一个列表(您可以从
中看出)。像
b
这样的类型变量指定任何类型–它可以是列表,也可以是其他类型。(看起来您对基本语法还不是很熟悉,这使得对类型进行推理变得更加困难。)@user63377-1。你可以知道
f
有一个类型为
[a]
的输入,因为你把它与
f(s:z)
一起使用,这里
s:z
是它唯一的参数,需要有类型
[a]
(当
s::a
时,因为
(:)
(:)::::::a->[a]
)-2。正如您从右侧的括号中看到的那样,
f
只接受一个参数(您可以认为Haskell中的每个函数只接受1)-左侧的
f
rcons