SML을 처음 사용하고 목록의 항목 색인을 얻으려고합니다. List.nth를 사용하면 인덱스 위치에서 항목의 값을 얻을 수 있지만 인덱스 값을 원한다는 것을 알고 있습니다. 내가 모르는 기능이 내장되어있을 수도 있습니다. 내 경우에는 목록에 중복이 포함되지 않으므로 항목이 목록에 있으면 색인을 얻습니다. 그렇지 않으면 ~ 1을 반환합니다. 지금까지 제가 가지고있는 코드는 다음과 같습니다. 그것은 작동하지만, 나는 매우 깨끗하다고 생각하지 않습니다SML : 목록의 항목 색인을 가져옵니다.
fun index(item, xs) =
let
fun index'(m, nil) = NONE
| index'(m, x::xr) = if x = item then SOME m else index'(m + 1, xr)
in
index'(0, xs)
end
: 나는 ML 관용구에 더 맞는 구현을위한 몇 가지 변경을 제안
val L=[1,2,3,4,5];
val m=length L-1;
fun Index(item, m, L)=if m<0 then ~1 else
if List.nth(L, m)=item then m else Index(item,m-1,L);
귀하의 질문은 무엇입니까? 필자는 적어도 List 구조가 아닌 표준 함수가 명시 적으로 존재하지 않는다고 생각합니다. 코드를 정리할 때, 1)'~ 1'을 반환하는 대신에 Option이나 예외를 사용하고, 2) 외부 함수에서 함수를 래핑하여 'm'매개 변수를 숨기고, 3) m에서 패턴 매칭을 사용할 것을 제안합니다. '하나의 조건을 없애기 위해 ('m <0 ...') – waldrumpus
팁 주셔서 감사합니다. 문제는 정말로 "이 작업을 수행하는 가장 좋은 방법은 무엇입니까?"였습니다. 어쨌든 L의 길이에 따라 다르므로 m을 함수에 전달하지 않는 것이 좋을 것입니다. 그러나 저는 SML을 처음 접했고 두 함수를 결합하는 방법을 모른다고 말했던 것처럼 말입니다. 코드의 이유는 다음과 같습니다. 나는 관련된 여러 유형의 두 가지 목록을 가지고 있습니다. 목록 1의 항목을 업데이트하려면 목록 2의 동일한 위치에있는 항목을 업데이트해야합니다. List 구조가 "zip"과 같은 것을 제공 할 수 있다고 생각하지만 지금은 제대로 작동하고 있습니다. –