2012-05-13 3 views
6

나는 F #을 배우고 있으며 작동하는 것을 쓰고 있지만 완전히 이해하지 못한다는 것을 알고있다. 여기에, 예를 집F # 여러 문장으로 된 람다 표현

let processArgs args = 
    match args with 
    | null 
    | [||]   -> [fun() -> getCredentials(); home 20; mentions 20; messages 20] 
    | [|"-h"|] 
    | [|"-?"|]  -> [showHelp] 
    | [|"-reset"|] -> [clearAllSettings] 
    | _    -> [fun() -> printfn "%s" (String.Join(" ", args))] 

[<EntryPoint>] 
    let main (args:string[]) = 
    try 
     let actions = processArgs args 
     List.iter (fun action -> action()) actions 
     0 
    finally 
     Console.ResetColor() 
     Console.CursorVisible <- true 

방법의 getCredentials을의 언급, 메시지, showHelp와, 그리고 clearAllSettings는 모든 단순 기능이며, 당신이 무엇을 기대 않습니다. (네, 트위터 클라이언트입니다, 그 새로운 '안녕하세요'데모하지?)

라인 : 내가 원하는

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

작품처럼. getCredentials를 호출 한 다음 집으로 돌아온 다음 멘션과 메시지를 호출합니다.

저의 관점에서 볼 때 세미콜론은 명령문 분리 기호와 같은 역할을합니다. 나는 전에 이것을 설명한 것을 보지 못했다. 그게 여기서 벌어지고있는거야?

이 글을 쓰는 관용적 인 방법이 있습니까? (즉, 노련한 F # 프로그래머가 바닥을 훑어보고 웃으면 서 이걸 보았을까요?)

추가 정보 : 내 원래 의도는 작업 목록을 작성한 다음 옵션을 발견 할 때 작업을 추가하는 것이 었습니다. C#에서는 일반적으로 List < Action>()을 사용하여이 작업을 수행했습니다. 세미콜론은 원래 다음과 같이 작성하려고했기 때문에 놀랐습니다.

[getCredentials; home 20; mentions 20; messages 20] 

하지만 컴파일러는 그것을 좋아하지 않았습니다.

+1

음, 언어 사양 주위에 파고의 몇 시간이 답을 알 수있다. 그것은 장황한 구문으로 알려진 구문의 한 형태입니다. 여기에 그것을 설명하는 링크가 있습니다 : http://msdn.microsoft.com/en-us/library/dd233199.aspx 나는 F # 'ers가 그것을 어떻게 할 것인지 명령 줄 인수를 구문 분석하는 것에 대한 나의 접근법이 있는지를 궁금해하고 있습니다. –

답변

3

당신은 쓸 때 :

[fun() -> getCredentials(); home 20; mentions 20; messages 20] 

컴파일러는 타입 unit -> unit의 함수 하나의 요소 목록을 만듭니다. S1 ; S2은 S1의 타입이 unit 일 때 시퀀스 구성이며 S1과 S2가 순서대로 실행되고 S2의 결과가 반환됩니다. 따라서 세 가지 기능, 즉 home, mentionsmessages은 실제로는 int -> unit이라는 서명이 있습니다. 당신이 4 개 가지 기능의 목록을 만들려면

, 그것은해야한다 :

[ getCredentials; // ; is optional 
    fun() -> home 20; 
    fun() -> mentions 20; 
    fun() -> messages 20 ] 

이 기능은 사용의 혼동을 피하기 위해 공백으로 구분되며, 목록 구분 기호 및 시퀀스 구성으로 귀하의 예제는 하나의 요소와 모든 목록을 가지고 있기 때문에

, 그것은 많은 단순화 할 수있다 :

let processArgs = function 
    | [||]   -> getCredentials(); home 20; mentions 20; messages 20 
    | [|"-h"|] 
    | [|"-?"|]  -> showHelp() 
    | [|"-reset"|] -> clearAllSettings() 
    | args   -> printfn "%s" (String.Join(" ", args)) 

[<EntryPoint>] 
let main (args:string[]) = 
    try 
    processArgs args 
    0 
    finally 
    Console.ResetColor() 
    Console.CursorVisible <- true 
+0

당신은 정확합니다. 내 C# 관용구가 계속해서 나아 간다. 감사. –

+0

그냥 작은 수정, _ _ -> ... args -> ... – Bernadette

+0

감사합니다 @ 베나 데트, 그것은 고쳐졌다. – pad