2013-07-24 4 views
2

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); 
+1

귀하의 질문은 무엇입니까? 필자는 적어도 List 구조가 아닌 표준 함수가 명시 적으로 존재하지 않는다고 생각합니다. 코드를 정리할 때, 1)'~ 1'을 반환하는 대신에 Option이나 예외를 사용하고, 2) 외부 함수에서 함수를 래핑하여 'm'매개 변수를 숨기고, 3) m에서 패턴 매칭을 사용할 것을 제안합니다. '하나의 조건을 없애기 위해 ('m <0 ...') – waldrumpus

+0

팁 주셔서 감사합니다. 문제는 정말로 "이 작업을 수행하는 가장 좋은 방법은 무엇입니까?"였습니다. 어쨌든 L의 길이에 따라 다르므로 m을 함수에 전달하지 않는 것이 좋을 것입니다. 그러나 저는 SML을 처음 접했고 두 함수를 결합하는 방법을 모른다고 말했던 것처럼 말입니다. 코드의 이유는 다음과 같습니다. 나는 관련된 여러 유형의 두 가지 목록을 가지고 있습니다. 목록 1의 항목을 업데이트하려면 목록 2의 동일한 위치에있는 항목을 업데이트해야합니다. List 구조가 "zip"과 같은 것을 제공 할 수 있다고 생각하지만 지금은 제대로 작동하고 있습니다. –

답변

5

내 이전의 코멘트에 자세히 설명하려면 개별 변경 사항은 다음과 같습니다.

  • index 값이 int option 인 경우. NONE은 항목이 목록에 없음을 의미하고 SOME i은 목록에 있음을 의미하며 첫 번째 발생 색인은 i입니다. 이렇게하면 특별한 값 (~1)을 사용할 필요가 없으며 함수의 의도 된 사용법을 그 유형에서 유추 할 수 있습니다.
  • 매개 변수 m을 숨기려면이 함수의 이름을 index'으로 바꾸고 적절한 인수로 호출하는 외부 함수 index으로 바꾸십시오. 소수 문자 (`)는 종종 보조 값을 나타냅니다.
  • List.nth의 필요성을 없애기 위해 목록에서 패턴 일치를 사용하여 개별 요소를 가져옵니다.

또한 대문자가 생성자 상수를 사용하는 동안 가장 일반적으로, 기능과 변수 이름은 소문자 (인덱스 아니라 보다는 지수)로 시작주의 (일부) 등이있다.

+0

철저히 설명해 주셔서 감사합니다. 나는 여기서이 관용구를 여러 번 보았으며 같은 이름으로 내부와 외부 함수를 모두 명명하는 목적을 이해할 수 없었다. 나는 Google에 그것을 시도했다. 그러나 그것이 당신이 무엇인지에 관해 모르는 무엇인가 검색하는 것은 어렵다. 다시 한 번 감사드립니다! :) –

0

나는이 index 기능의 더 간단하고 덜 효율적인 버전을 제안하고자합니다. 나는 int option보다는 예외를 사용하는 것이 바람직하지 않으며 tail-recursive가 아니라는 것에 동의합니다. 그러나 확실히 읽기 쉽기 때문에 학습 자료로 사용할 수 있습니다.

fun index (x, []) = raise Subscript 
    | index (x, y::ys) = 
    if x = y then 0 else 1 + index (x, ys)