2017-03-01 9 views
11

학습 시작 F #. 커맨드 라인 args에서 무엇이 발견되었는지를 알려주는 간단한 프로그램을 만들고 싶습니다. 나는 가지고있다 :F # noob : 일치하는 명령 줄 args

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    match argv with 
    | [] -> 42 
    | _ -> 43 

그러나 이것은 오류를 준다. 내가 ARGV를 위로 마우스를 이동하면 내가 참조 :

val argv : string[]

내가 (문자열 목록) 예상했을 것입니다. 그러나 첫 번째 일치 식에 오류가 있습니다.

Error 1 This expression was expected to have type string [] but here has type 'a list

기본적으로 빈 문자열 목록 (빈 문자열 목록)에서 일치 시키려고합니다. 그렇게 할 수있는 올바른 방법은 무엇입니까?

나는 추가해야한다 : 나는 해결책을 원한다. (좋을지라도). 나는 또한 컴파일러가 내가 그것을 제공하지 않을 것을 찾고있는 것을 이해하고 싶다.

답변

17

[] 리터럴이 빈 목록을 나타내는 데 사용되지만 string []은 목록이 아닌 문자열 배열이므로 혼동 될 수 있습니다. F 번호에 많은 겉으로는 일치하지 않는 것처럼

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    match argv with 
    | [||] -> 42 
    | _ -> 43 

,이 듀얼 유산의 결과이다 :

이 같은 배열에 대한 패턴 일치 수 있습니다.

OCaml의, 당신은 각각의 값에 대한 int listint array 유형에 대한, [1;2;3][|1;2;3|]을 사용하십시오. 그러나 C#/.NET에서 대괄호 (int[])는 배열을 처리하고 있음을 나타내는 방법입니다.

.NET 군중에서 좀 더 쉽게 접근 할 수 있도록 형식 이름 F #은 array의 별칭으로 []을 사용하므로 두 형식을 모두 사용할 수 있습니다. 이것은 빈리스트 리터럴과 일치하는 것이 오히려 불행한 일이지만 '그대로'하는 것은 또 다른 제약 사항이었습니다. F # 디자인의 초기 목표 중 하나는 OCaml 코드와 호환되도록하는 것이 었으므로 해당 언어에서 F #으로 이식하는 것은 마찰과 같습니다 가능한 한.

+0

예! 그것은 혼란 스럽다! 일치하지 않는 것 같지만, 감사합니다! 당신의 해결책은 작동합니다 – user1443098

+3

@ user1443098 답변을 표시하는 것을 잊지 마세요 (그냥 녹색 눈금을 클릭하십시오;) –

+0

@ user1443098 : 동의합니다. 그것은 일정한 의미에서 일관성이 있지만, 아마도 그것이 기대되는 곳이 아닐 수도 있습니다. 대답에 대한 배경을 추가했습니다. – scrwtp