2013-05-23 2 views
0

인수가 숫자라면, 제곱근을 반환해야하는 간단한 함수와 F # 패턴 매칭을 계속 학습합니다. 나는 그것을 약간 수정했고 다음과 같이 보입니다.F # 함수는 여러 유형을 반환합니다 (일반 개체 유형의 반환 종류)?

let my_sqrt (o: obj) = 
    match o with 
    | :? float as d -> (sqrt d).ToString() 
    | _ as x -> x.ToString() 

내 용도로는 잘 작동하지만 반환 값을 문자열로 변환하지 않으려면 어떻게해야합니까? 어떻게하면 "어떤 객체"를 반환하고 printfn "%A" (my_sqrt [| 1; 2; 3 |]) 구조에서 사용할 수 있습니까?

+3

내가 요청할 수있는 경우를, 그것은 플로트가 아닌 경우 인수가 변경되지 반환의 목적은 무엇인가? 어떤 상황에서 유용할까요? – sepp2k

+0

내가 알고 싶은 것을 보여주기 위해 다른 유형을 반환하는 함수의 예제를 작성했습니다 :-) – asdf

답변

5

난 당신이

-1

나는 당신의 기능을 확인 생각 오브젝트 단지 업 캐스팅

let my_sqrt (o: obj) = 
    match o with 
    | :? float as d -> (sqrt d) :> obj 
    | _ as x -> x 

을 원하는 생각합니다. 각 제곱근을 계산 할 때이 같은 배열을 통해 기능을 매핑해야합니다 : 귀하의 예를 들어 당신이 뭘 하려는지 단지 데모입니다

Array.map my_sqrt [| 1.0; 2.0; 3.0 |] |> printfn "%A" 
8

에도 불구하고, 그것은 지적 가치가있다 이것은 아마도 좋은 디자인이 아닙니다. F 번호, 당신은 일반적으로 캐스트를 사용하여 객체에서 작동 기능을 사용하지 것이다 - 차별 조합이됩니다 더 좋은 방법이를 표현하기 :이 기능은 하나 Numeric 또는 Other하지만 덕분 유형에서 작동

type MyInput = 
    | Numeric of float 
    | Other of obj 

let my_sqrt = function 
    | Numeric d -> Numeric (sqrt d) 
    | Other o -> Other o 

DU에게, 당신은 어떤 주조도 필요하지 않습니다. 나는이 선들을 따라 무언가가 실제 문제에 대한 더 나은 접근법이 될 것이라고 생각한다.

+0

좀 더 설명 할 수 있습니까? 저는 F #과 새로운 타입의 강력한 타입에 익숙합니다. 그래서 이것은 다소 혼란 스럽습니다. 우리는 유형 집합의 종류를 정의하고 그 부속 유형과 함께 작동하는 함수를 정의하지만이 함수의 반환 값을 래핑하는 목적은 무엇입니까? 그 함수가 MyInput을 가져 와서 MyInput을 반환하는 것을 보여주기 위해서? – asdf

+1

@dig 아이디어는 함수가 무엇을 반환하는지 명시해야한다는 것입니다. 함수에'obj -> obj'가 있으면 아무 것도 받아서 아무것도 반환 할 수 없다는 말입니다. 'MyInput'의 목적은 함수가'float' (어떤 경우에는 특별한 것을합니다) 또는 다른 것을 취하는 것을 말하는 것입니다.동일한 유형의 반환 값을 래핑했습니다. 함수를 호출 한 후 두 경우를 구별해야한다고 생각했기 때문입니다. –

+0

@dig 그러나 관심있는 특정 용도에 대해 더 많이 알지 못하면 유용한 대답을하는 것이 어렵다고 생각합니다. –

0

TP 응답에서 언급했듯이, 가능하면 어디에서나 입력 시스템에 정보를 표시해야합니다.

  • 그것은이 다음 쉽게 읽고 당신이 이름 일을 가지고, 프로그램을 추론 할 수.

  • 는 투자 항상 가치가 있습니다

뭔가 잘못을했을 때 F 번호가 실제로 당신에 대한 작업과 당신을 말할 수 있다는 것을 의미합니다.

0

저는 Tomas와 함께 Discriminated Union을 사용하는 것이 더 좋을 것이라고 동의합니다. 아무 어느 모나드는 F 번호에 내장하지 않고, 당신이 인터페이스를 표준화하기 위해 선택 조합을 사용할 수

let my_sqrt (o : obj) = 
    match o with 
    | :? float as d -> Choice1Of2 (sqrt d) 
    | o -> Choice2Of2 o;; 
관련 문제