첫째, 당신이 어떤에서 모든 예에서 반복해야하는 경우 모르겠어요. 코드는 항상 첫 번째 행의 값을 반환합니다. 예제를 조금 복잡하게 만들고 특정 ID를 결과로 얻고 싶지 않을 수도 있다고 가정합니다 (따라서 루핑을해야 할 수도 있습니다).
함수 언어에서 루핑 구문을 작성하는 일반적인 방법은 재귀를 사용하는 것입니다. 많은 경우에 직접 사용할 수있는 유용한 고차 함수가 많이 있으므로 재귀를 명시 적으로 사용하지 않아도됩니다.
이
let id =
(use r = command.ExecuteReader()
let rec read() =
if r.Read() then
let id = r.GetInt64(0)
if weWantThisId id then id // this is the ID we want
else read() // continue reading IDs
else 0 // default value/throw
read())
read
기능은 다음과 같습니다 그 다음은, 그 자체를 호출하지 않으면 반복적으로 다음 줄을 읽기 위해 ID 반환 성공하면 -이 경우, 간단한 재귀 함수 번 r.Read()
를 호출 read
을 쓸 수 있습니다 id
값을 초기화하는 범위에 로컬 함수로 작성됩니다. 즉, F #이 값을 id
에 할당하면 ExecuteReader
을 실행 한 다음 로컬 함수 read
을 실행합니다 (초기화를 단일 표현식으로 작성하는 방법). 물론이 존이 시사하는 바와 같이 fetchId
함수를 작성하기 위해 더 많은 읽을 수 있습니다 (F #으로 다시 재귀를 사용합니다) :
let fetchId() =
use r = command.ExecuteReader()
let rec read() =
if r.Read() then
let id = r.GetInt64(0)
if weWantThisId id then id
else read()
else 0
read()
'r'을 (를) 삭제하는 방법은 무엇입니까? – Gabe
두 번째 스 니펫에 한 행이 누락되어 혼란을 야기했을 수 있습니다. 어쨌든'use '를 사용하고 있으므로 범위를 벗어나는 경우 (첫 번째 예제에서 ID를 계산 한 후 또는 두 번째 예제에서 함수에서 반환 한 후)'r '이 자동으로 삭제됩니다. –
완벽한, 첫 번째 예제는 내 질문에 대답했다. 사실 내 코드가 루프와 휴식을 가지고있는 이유는 거기에 if (cond)와 cond 문 (그 자체의 기능에서는 의미가없는)이 계속 존재하기 때문입니다. 나는 자신의 범위가있는 if 문에서 변수를 할당하는 기능을 좋아합니다. –