문제
Microsoft에서 F# 샘플, 그들은 ">>"연산자를 다음과 같이 사용합니다.
test |> Seq.iter (any_to_string >> printfn "line %s");
이 맥락에서 ">>"연산자는 무엇을합니까? 시퀀스의 각 항목 (이 경우 배열)이 any_to_string
암시 적으로? 이것은 비슷합니다 (fun item -> printfn "line %A" item)
?
해결책
동등한 코드는 다음과 같은 방식으로 작성할 수 있습니다.
test |> Seq.iter(fun x -> printfn "line %s" (any_to_string x))
다시 말해, >> 연산자는 단순히 다음을 수행합니다. f (x) type t와 y)가 t 형이있는 함수 f (x)가 주어지면 f >> g를 사용하여 함수 h (z)를 만들 수 있습니다. g (f (x))와 동일합니다. 인수는 없지만 내부 및 외부 기능을 해당 연산자에게 전달해야하며 결과는 코드에서 언제든지 적용 할 수있는 기능이므로 다음을 수행 할 수 있습니다.
//myFunc accepts any object, calls its ToString method, passes ToString
//result to the lambda which returns the string length. no argument is
//specified in advance
let myFunc = any_to_string >> (fun s -> s.Length)
let test = 12345
let f = 12345.0
//now we can call myFunc just like if we had definied it this way:
//let myFunc (x:obj) = obj.ToString().Length
printfn "%i" (myFunc i)
printfn "%i" (myFunc f)
다른 팁
(>>)
두 가지 함수 (호환 인수와 함께)를 취하고 하나의 함수로 결합하는 ( "composes") 고차 함수입니다.
예를 들어
let len (s : string) = s.Length
let show (n : int) = n.ToString()
라인
(show >> len) 15
동일합니다
len (show 15)
만큼 잘
show 15 |> len
정의
말한다
val ( >> ) : ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c)
//Compose two functions, the function on the left being applied first
그러나 다른 사람들이 더 심층적 인 설명을 제공하기를 바랍니다.
편집하다
지금 MSDN DOC
http://msdn.microsoft.com/en-us/library/ee353825(vs.100).aspx
기능 구성 연산자입니다 (다른 게시물에 설명 된대로)
그의 의미론을보기 위해이 연산자를 직접 정의 할 수 있습니다.
let (>>) f g = fun x -> g (f x)
C#, Generics 또는 Lambdas에 불편한 경우에는 전혀 도움이되지 않을 수 있지만 C#에 해당합니다.
//Takes two functions, returns composed one
public static Func<T1, T2> Compose<T1, T2, T3>(this Func<T1, T2> f, Func<T2, T3> g)
{
return (x) => g(f(x));
}
유형 매개 변수를 보면 Brian의 답변과 같은 것을 읽습니다.
Compose는 T1에서 T2로 이동하는 하나의 함수와 T2에서 T3으로 이동하는 하나의 기능을 취하고 T1에서 T3으로 이동하는 두 가지의 조합을 반환합니다.
그만큼 >>
연산자는 기능 구성을 수행하며 꽤 잘 설명됩니다. Wikipedia에서. Dustin Campbell은 그것을 잘 사용하고 그것을 설명합니다 ( |>
(포워드 파이프) 운영자) 그의 블로그에서.