F #

2014-09-04 7 views
1

에서의 추론 문제 Visual Studio에서 F #을 사용하여 필자가 원하는 형식을 명시 적으로 더 많이 명시해야한다는 것을 알았습니다. 나는 이것을 해결하기위한 몇 가지 기술, 특히 우수한 순방향 배관 작업자의 사용에 대해 알고 있습니다. 그러나, 나는 많은 상황에서 이렇게 피할 수 없으며, 그 중 일부는 명백히 틀린 것처럼 보입니다. 세번째 줄은 해결 방법에 대한 호출로부터 리턴 쌍의 제 필요 타입 주석을 제안 오류 메시지를 생성F #

let b = new pqBoard(this) 
    let b2,steps = b.Solve() 
    if b2.Solved() then 
     let cont = steps |> List.exists (fun (s : string) -> s.IndexOf("Contradiction") >= 0) 

:

예를 들어, I는 다음 코드 등 F # 코드를 이전 줄에. 그러나 쌍의 두 번째 요소 (문자열 목록)는 괜찮으며 이러한 주석이 필요하지 않습니다. 형식 검사기가 겉으로보기에는 쌍의 두 번째 형식인지 여부는 어떻게 알 수 있습니까? 단 한 번의 호출에서 반환 될 때 첫 번째 형식의 형식 검사기가 아닌가요?

let (b2 : pqBoard,steps) = b.Solve() 

왜 내가 명시 적으로 첫 번째 요소가 아닌 초를 입력해야합니다 : 수정에게 문제를 다음과 같이

는 두 번째 줄을 변경?

또한이 경우와 기타 많은 경우 유추 된 유형이 VS에서 툴팁으로 올바르게 표시됩니다. 나는 VS 편집기가 어떤 의미에서 "짐작"하고 있다고 가정하지만, 나는 그것이 잘못 추측 된 것을 아직 보지 못했습니다!

필자는 필 요한 이유가 무엇인지 알지 못하고 명시 적으로 유형을 제공해야한다는 점을 실망스럽고 실망시킵니다. 어떤 도움을 주시면 감사하겠습니다. pqBoard의 정의와는 무슨 일을 정확히 확인하기 위해 하드 년대 Solve 회원하지만 샘플 b2steps 사이의 키 차이를 보지 않고

+2

'Solve' 및'Solved'의 구현을 제공 할 수 있습니까? –

+1

툴팁에 관해서 - 때로는 VS가 속임수로 쓰였으며, 실제 코드에서는 할 수없는 뒤로 보았습니다. –

+1

"Solve"의 정의를 알기는하지만 그것은 generic 함수라고 생각합니다. 'b2.Solved()'를 사용하는 것은'b2'의 타입을 알아야하지만'List.exists'와's : string'에 의해 스텝이 효과적으로 타입이 덧붙여집니다. –

답변

4

그들이 생성하는 방법에 반대 사용되는 방법이다. steps의 경우

은, 일부 'a에 대한 list<'a>을해야하는, List.exists에 전달, 그리고 함수 인수는 명시 적으로 string를 취할 주석, 그래서 유형 검사기 즉시 steps 유형 list<string>이어야 것을 볼 수 있습니다.

b2의 경우 멤버 함수가 호출되고 있습니다. Solved이라는 멤버 함수가있는 형식이 많이있을 수 있으며 F #에는 어떤 식 으로든 b2 형식을 알지 못하고 호출되는 형식을 확인할 방법이 없습니다.

일반적으로 - 범용이 아니지만 F #에서 .을 사용하면 .의 왼쪽에있는 유형을 명시 적으로 이전에 명시 적으로 지정해야하지만 더 많은 "기능적"구조 및 유형 습관.

+0

많은 감사합니다. 나는 그것에 대해 당신의 의견이 "보편적이지 않다"는 것이 나의 혼란에 큰 공헌자라고 생각하지만, 나는 앞으로 그렇게 될 것이라고 기대하지 않는다. – stephensong