If statement 从OCaml中的列表中取出值

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

我正在用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  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列表。如果没有看到一些代码,我不能说更多。