2017-09-20 2 views
2

에 두 개의 매개 변수를 익명 함수를 단순화 함수가 다른 함수의 인수가되는 함수? 내가 익명 함수가있는 경우</p> <pre><code>(f x -> f x) </code></pre> <p>내가 같은이 두 매개 변수에 수행 할 수 있습니다</p> <pre><code>(<|) </code></pre> <p>로 단순화 할 수 있습니다, 느릅 나무에서 느릅 나무

(\x y -> f x y |> g) 

나는 단순히

(f |> g) 

를 사용할 수 있다고 생각하지만, 컴파일러는 유형에 대해 불평.

특히, 내 update 기능에 대한 사례 중 하나에, 나는 이런 일이 : 나는 (update |> Tuple.first) 같은 것으로 List.foldl에 익명 함수 인수를 단순화하기 위해 노력하고

let 
    msgNames = [Foo, Bar] 

    values = ["f", "b"] // These values are actually derived 
         // by a more complicated operation 

    model_ = List.map2 (<|) msgNames values 
       |> List.foldl (\msg mod -> update msg mod |> Tuple.first) 
         model 
in 
    (model_, Cmd.none) 

을하지만, 나는 다음을 얻을 컴파일러에서 오류 :

The right side of (|>) is causing a type mismatch. 

159|          update |> Tuple.first) 
                ^^^^^^^^^^^ 
(|>) is expecting the right side to be a: 

    (Msg -> Model -> (Model, Cmd Msg)) -> a 

But the right side is: 

    ((Model, Cmd Msg)) -> Model 

답변

4

우리는 몇 가지 단계를 수행 할 수는 단순화 :

(\x y -> f x y |> g) 
... can be written as 
(\x y -> g (f x y)) 
... can be written as 
(\x -> g << f x) 

한 단계 사물이 좀 더 혼란 스러울 :

(g .) . f 
:

(((<<) g) << f) 

이것은 당신이 (기능 조성물은 . 연산자를 사용하여 수행되는 경우 하스켈 인) 에서 무엇을 얻을 일치

가독성을 높이려면 다음과 같이 직접 삽입 함수를 만들고 싶을 수도 있습니다.

infixr 9 <<< 
(<<<) : (c -> d) -> (a -> b -> c) -> (a -> b -> d) 
(<<<) g f x y = 
    g (f x y) 

그리고 지금 당신은 다음과 같이 사용할 수 있습니다 :

(g <<< f) 
+0

감사합니다. 그것이 내가 찾고 있던 것입니다. 나는 (((<<) g) << f)는 지나치게 읽을 수없고 단순한 익명의 기능보다 개선되지 않을 수도 있다는 것에 동의한다. – Ralph

관련 문제