다음 코드를 실행하면 빈 목록이 반환되지만 그 이유는 확실하지 않습니다. 제 생각에는 for 루프에서 반복하는 것이 아직 이해하지 못하는 효과가 있다는 것입니다. 결과 목록을 변경 가능하도록 변경하면 모든 것이 작동한다는 것을 알고 있습니다. fileNames 와 게임 사이에는 관계가 없습니다 (즉, 일대일 일치 할 필요가없는 게임 또는 파일 수)
let createList (fileNames: string list) =
let games = [ "DMC";"Aztez"]
let result = List.empty<(string * string)>
for filename in fileNames do
for game in games do
let a = [filename, game]
result = result @ a
result
두 for 루프 내부의 줄에는 "이 표현식에는 'unit'유형이 있어야하지만 'bool'유형이 있어야합니다. 표현식의 결과를 삭제하려면 'ignore'를 사용하고 결과를 바인딩하려면 'let'을 사용합니다. 이름에. "
아래 코드에는 예상되는 동작이 있습니다.
let createListM (fileNames: string list) =
let games = [ "DMC";"Aztez"]
let mutable result = List.empty<(string * string)>
for filename in fileNames do
for game in games do
let a = [filename, game]
result <- result @ a
result
하지만 변경 가능한 목록을 사용할 필요가 없다면 더 좋을 것입니다.
요약하자면 a) 첫 번째 코드 샘플 결과가 비어있는 이유를 알고 싶습니다. 새 값에 @가 추가되지 않는 이유는 무엇입니까? (::도 시도했습니다) b)이 작업을 수행하는 더 좋은 방법이 있습니까?
감사
경고에서 알 수 있듯이
result = result @ a
bool
목록 result
과 result @ a
같은지 여부를 나타내는로 평가됩니다 . 이 부울은 폐기됩니다. 따라서 for 루프는 두 컬렉션을 반복하고 사용되지 않는 bool의 수를 계산합니다.
yield를 사용하여 가변 변수를 사용하는 대신 목록 이해력을 만들 수 있습니다.
let createListM (fileNames: string list) =
let games = [ "DMC";"Aztez"]
[for filename in fileNames do
for game in games do
yield (filename, game)]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다