Functional programming 我如何获得这个(Miranda函数式编程)的类型定义?
rcons s f z=f(s:z)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 一步一步地 如果给你这样的练习,你首先要确定从
我需要得到上面的类型定义,我很难弄清楚怎么做。从
开始:
-它暗示如果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