代码之家  ›  专栏  ›  技术社区  ›  ScootyPuff

无点形式与风格

  •  6
  • ScootyPuff  · 技术社区  · 15 年前

    你能转换吗?

    -- tupleUnfold :: forall a. ((forall b. a -> b)) -> a -> ((b))
    tupleUnfold :: Int -> ExpQ
    tupleUnfold n = do
      xs <- forM [1 .. n] (const . newName $ "x")
      y <- newName "y"
      let y' = varE y
          g (ps', es') x = (varP x : ps', appE (varE x) y' : es')
          (ps, es) = foldl' g ([], []) xs
      lamE [tupP ps, varP y] (tupE es)
    

    在保持清晰的同时使用无点样式(我知道程序是“无点的”,但更不希望混淆代码)?

    无论是哪种方式,都可以进行哪些更改来改进函数的样式,或者以其他方式使其意图更加清晰?该功能的用途如下。

    $(tupleUnfold 3) ((+ 1), (+ 2), (+ 3)) 2
    -- (3, 4, 5)
    

    要使用哪些更好的命名约定(参见ps、ps、es和es变量)?

    3 回复  |  直到 15 年前
        1
  •  5
  •   luqui    15 年前

    Control.Arrow (&&&) Control.Applicative (<$>)

    tupleUnfold :: Int -> ExpQ
    tupleUnfold n = do
        y <- newName "y"
        (ps,es) <- unzip . map (varP &&& (`appE` varE y) . varE) 
                    <$> replicateM n (newName "x")
        lamE [tupP ps, varP y] (tupE es)
    

    Data.Function (on)

    tupleUnfold :: Int -> ExpQ
    tupleUnfold n = do
        y <- newName "y"
        xs <- replicateM n (newName "x")
        let exps = tupE $ zipWith appVars xs (repeat y)
            pats = tupP $ map varP xs
        lamE [pats, varP y] exps
      where
        appVars = appE `on` varE
    
        2
  •  1
  •   urso    15 年前

    tupleUnfold n = do
      y <- newName "y"
      uncurry lamE . ((:[varP y]) . tupP *** tupE) . unzip .   
       map (varP &&& (`appE` varE y) . varE) <$> replicateM n (newName "x")
    


    tupleUnfold n = do
      y <- newName "y"
      uncurry lamE . ((tupP >>> (:[varP y])) *** tupE) . unzip .
        map (varP &&& (varE >>> (`appE` varE y))) <$> replicateM n (newName "x")
    

    tupleUnfold n = do
      y <- newName "y"
      (map (varP &&& (varE >>> (`appE` varE y))) >>> unzip >>>
        ((tupP >>> (:[varP y])) *** tupE) >>> uncurry lamE) <$> replicateM n (newName "x")
    

        3
  •  0
  •   John L    15 年前

    tupleUnfold :: Int -> ExpQ
    tupleUnfold = mapM (const . newName $ "x") . enumFromTo 1 >=> \xs -> do
        y <- newName "y"
        let y' = varE y
            g (ps', es') x = (varP x : ps', appE (varE x) y' : es')
            f ps = lamE [tupP ps, varP y] . tupE
        uncurry f $ foldl' g ([],[]) xs
    

    >=>

    推荐文章