2012-11-30 2 views
3

else 문 앞에있는 행은 분명히 유닛을 기대했지만 부울을 대신 가지고 있습니다. 나는 F #으로 시작하고 있지만 이걸 짐작할 수는 없다.누구나이 F # 스 니펫의 문제점을 알 수 있습니까?

전에 Stackoverflow를 사용 해본 적이 없으며 코드 상자가 여전히 혼란 스럽기 때문에 레이아웃과 조금 싸우고 있습니다! 원본의 간격은 들여 쓰기되어 있습니다.

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with 
    | 1 -> i 
    | 0 -> i 
    | _ -> 
     if m.ContainsKey(i) then 
      if m.[i] > 0 then 
       m.[i] 
      else 
       let x = fib(i - 1) + fib(i - 2) 
       m.Add(i, x) 
     m.[i] 

누구든지이 게시물에 간격을 유지하는 방법을 알려 주시면 감사하겠습니다.

+0

을 음, F 번호에 매우 능숙하지, 그래서 내가 잘못 무엇인지 말할 수 있지만, 코드를 작성의 기능 및 declarational 방식의 결합이 유형은 아니다 아주 좋은 생각이야. :-) – nothrow

+0

@Yossarian - 이것은 실제로 F의 매우 일반적인 패턴입니다. –

+0

@JohnPalmer, 정말요? 나는 내가 그것을 보지 못했기 때문에 기쁘다. 나는 일종의 순수 주의자이다. :-) – nothrow

답변

5

마지막 부분이 약간 잘못 - 당신은 if 문 내에서 반환하는

if m.ContainsKey(i) then 
     if m.[i] > 0 then 
      m.[i] 
     else 
      let x = fib(i - 1) + fib(i - 2) 
      m.Add(i, x) 
      x 

을해야합니다. 아마도 if m.[i] > 0이 필요하지 않을 것입니다. 이 경우 다음 강조 표시를 눌러 Ctrl + K 또는 (코드는 과거 일반 텍스트 네 개의 공간을 들여 자동으로 코드 모드로 섹션을 넣어 {} 버튼을 누르면 그냥 코드를 붙여 유래에 서식

let m = Dictionary<int, int>() 

let rec fib i = 
    match i with 
    | 1 -> i 
    | 0 -> i 
    | _ -> 
     if m.ContainsKey(i) then 
      m.[i] 
     else 
      let x = fib(i - 1) + fib(i - 2) 
      m.Add(i, x) 
      m.[i] 

를 얻을 수)

+0

귀하의 수정 선생님 자리에, 정말 고마워요. 이번 주 월요일 아침에 F #을 시작했는데, 온라인에서 여러 가지 일을 잘하는 것을 읽은 후. 나는 VB에서 휴식을 원했고 타입 제공자는 매혹적이었다. 어쨌든, 당신과 eirik의 적시의 도움과 설명에 감사드립니다. –

+0

대화식으로 이것을 실행하고자하는 초보자를위한 팁은 대화식 세션에서 정규화 된 이름이 필요하므로 m : System.Collections.Generic.Dictionary ()과 같이 사전 라인을 수정하십시오. –

+0

@ 리차드 - 'System.Collections.Generic 열기'를 사용하여 동일한 효과를 얻을 수도 있습니다. 또한 - 이것이 올바른 답이라면 녹색 진드기를 치고 그것을 받아들이도록 표시하여 미래의 모든 사람들이 그것이 옳다는 것을 알 수 있도록하십시오. –

3

그런 종류의 언어를 처음 접하는 사람이라면 쉽게 실수 할 수 있습니다. F #은 표현식을 기반으로하므로 if - then - else 절은 평가되는 표현식입니다. 이를 수행하기 위해 유형 검사기는 if 표현식의 모든 분기가 패턴 일치와 동일한 유형이어야한다고 요구합니다. 또한 else 분기가 누락 된 표현식이 if 인 경우 분기의 ​​유형이 unit 인 경우에만 유효합니다.

  1. 중첩 if 표현은 다른 유형의 값 (즉 intunit을 생산하는 지점이 있습니다

    마음에 그런 것들을 유지,이 조각 유형은 두 가지 이유의 계정에 확인 통과하지 않습니다 것을 알 수 있습니다) 및

  2. 외부 if 표현식은 내부 사람이 unit 유형을 가질 것으로 기대합니다.

희망이 도움이 :)

+0

고마워요. 다시 읽었고 완전히 구해서 신청합니다. 당신이 말했듯이, 나는 이런 타입의 코딩을 처음 접했습니다. –

관련 문제