If statement 从OCaml中的列表中取出值
我正在用OCaml创建一个列表列表,我很难理解如何实现我的目标 我的目标是实现以下目标: 给定V=(01-1)作为列表: 预成型此方程式:If statement 从OCaml中的列表中取出值,if-statement,recursion,ocaml,If Statement,Recursion,Ocaml,我正在用OCaml创建一个列表列表,我很难理解如何实现我的目标 我的目标是实现以下目标: 给定V=(01-1)作为列表: 预成型此方程式: (2*V1 - 1)*(2*V2-1) = ? (2*V1 - 1)*(2*V3-1) = ? (2*V1 - 1)*(2*V4-1) = ? (2*V2 - 1)*(2*V3-1) = ? (2*V1 - 1)*(2*V4-1) = ? (2*V3 - 1)*(2*V4-1) = ? 然后将其转换为一个列表,如 0 V12 V13 V14 V21 0
(2*V1 - 1)*(2*V2-1) = ?
(2*V1 - 1)*(2*V3-1) = ?
(2*V1 - 1)*(2*V4-1) = ?
(2*V2 - 1)*(2*V3-1) = ?
(2*V1 - 1)*(2*V4-1) = ?
(2*V3 - 1)*(2*V4-1) = ?
然后将其转换为一个列表,如
0 V12 V13 V14
V21 0 V23 V24
V31 V32 0 V34
V41 V42 V43 0
其中矩阵是自身的反射
我将使用两个函数来实现这一点
第一个给出一个状态的输出,另一个给出整个矩阵
以下是我到目前为止所做的:
singleState state =
if state = 0.0 then 0.0
else
((2*state) -. 1);;
matrixState V =
if V = [] then []
else
singleState(hd(V)) * singleState(next item after head) + matrixState(tl(V));;
正如你所看到的,我不知道如何在V的头部之后取这个项目,比如V2
有什么建议吗
这就是我到目前为止所做的:
let singleState state =
if state = 0.0 then 0.0
else
((2.0 *. state) -. 1.0);;
let rec matrixState V =
match V with
| [] -> []
| hd :: [] -> V
| hd :: (nx :: _ as tl) ->
singleState hd *. singleState nx :: matrixState tl;;
你最好的办法是学会从模式匹配的角度思考。不必使用
=
来测试V
是否为空,您可以编写如下内容:
let rec matrixState v =
match v with
| [] -> []
| hd :: [] -> (* Not sure what you want here *)
| hd :: (nx :: _ as tl) ->
singleState hd *. singleState nx :: matrixState tl
首先,请记住,这只是一个函数的草图,它完成了您希望matrixState函数完成的任务。我不确定这对你问题的最终答案有多大帮助
这个函数的作用是将v(一个列表)与一系列模式匹配,并根据匹配的模式给出不同的答案
第一个模式([]
)与空列表匹配。正如在代码中一样,结果是一个空列表
第二种模式(hd::[]
)匹配只包含一个元素的列表。我不确定你想为这个案子做什么,所以我没有写代码
第三种模式(hd::(nx::u astl)
)匹配具有两个或更多元素的列表。它为第一个元素提供名称hd
,为第二个元素提供名称nx
。此外,它将名称tl
添加到列表的尾部(除第一个元素外的所有元素)。在这里您可以看到OCaml模式的威力
更新
(注意:你应该使用SO页面来问一个有特定技术答案的问题。你不应该使用同一页面来问一系列问题。这会让人们以后更难找到答案。如果你有一个新问题,你应该从新页面开始。)
在OCaml中,构造函数使用以大写字母开头的名称,普通变量使用以小写字母开头的名称。您在此处给出的代码将无法编译,因为您使用大写字母V
作为变量。注:在我上面的代码中,我使用小写v
如果我将大写字母V改为小写字母,您的代码对我来说可以编译。我没有发现任何错误
(同样,我建议您阅读一些关于OCaml的基础知识。这并不是为了避免帮助您,而是我认为它会帮助您更快更好。)好的,我是OCaml的新手,请您解释一下这里发生的事情。我不太理解第二行和第三行。我很乐意解释,但您可能应该阅读一些关于OCaml模式匹配的内容。这比在这里来回要快得多。我将在我的答案中添加一些额外的文本。感谢您的解释,当我现在看到它时,所有这些都是有意义的。您知道错误原因吗:此表达式具有类型float list,但可能会发生类型float的表达式?通常,编译器总是正确的:-)因此,您有一个应该只有一个float的float列表。如果没有看到一些代码,我不能说更多。