5

次の Haskell コードを移植しようとしています ( http://codepad.org/MMydRCxo )

foo :: Int -> Int -> Int -> Maybe Bool
foo a b c = if a == 1 then Just True else Nothing

bar :: Int -> Int -> Bool
bar b c = maybe False id $ foo 1 b c

-- point free
bar' :: Int -> Int -> Bool
bar' = ((maybe False id $) .) . foo 1

main = do
  print $ bar 2 3
  print $ bar' 2 3

エルムに行きましたが、まだ運がありませんでした。( http://share-elm.com/sprout/5271f160e4b03cf6e675bc97 )

foo : Int -> Int -> Int -> Maybe Bool
foo a b c = if a == 1 then Just True else Nothing

bar : Int -> Int -> Bool
bar b c = maybe False id <| foo 1 b c

-- point free
bar' : Int -> Int -> Bool
bar' = ((maybe False id <|) .) . foo 1

main = flow down [
    asText <| bar 2 3
  , asText <| bar' 2 3]

Elmでこの作業ポイントを無料にする可能性がある場合、何かアイデアはありますか? :)

ドビ

4

2 に答える 2

3

Haskell では、次の式はすべて同等です。

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

これは、fが単項関数でgあり、 が 2 項関数であり、2 つのパラメータが に渡されg、その結果が に渡されることを意味しますf「owl」オペレーターの詳細を読んで、その仕組みを理解してください。

したがって、同様の式を Elm に変換する場合は、次のいずれかを行います。

(.:) = (<<)<<(<<) -- owl operator definition
(<<) f << g
(<<) ((<<) f) g
f .: g

例えば:

((<<) negate << (+)) 3 4 -- returns -7
(negate .: (+)) 3 4      -- returns -7

注: Elm 0.13 (.)では に置き換えられましたが(<<)(>>)は現在と同じですflip (<<)

于 2015-07-09T17:03:27.110 に答える