Можете ли вы изменить значение переменной после установки? [Дубликат]

Вот пример из React doc: https://facebook.github.io/react/docs/jsx-in-depth.html#javascript-expressions-as-children

function Item(props) {
  return 
  • {props.message}
  • ; } function TodoList() { const todos = ['finish doc', 'submit pr', 'nag dan to review']; return (
      {todos.map((message) => )}
    ); }

    как ваш случай, я предлагаю написать вот так:

    function render() {
      return (
        
          {numrows.map((roe, index) => )}
        
      );
    }
    

    Обратите внимание, что ключ очень важен, потому что React использует Key для отличия данных в массиве.

    15
    задан Matt Fenwick 13 August 2012 в 16:20
    поделиться

    2 ответа

    Существует несколько решений для перевода императивного программирования i=i+1 в функциональное программирование. Рекурсивное функциональное решение является рекомендуемым способом в функциональном программировании, создание состояния почти никогда не будет тем, что вы хотите сделать.

    Через некоторое время вы узнаете, что вы можете использовать [1..], если вам нужен индекс, например , но требуется много времени и практики, чтобы мыслить функционально, а не императивно.

    Вот еще один способ сделать что-то подобное, как i=i+1 не идентично, потому что нет никаких разрушительных обновлений. Обратите внимание, что пример государственной монады просто для иллюстрации, вы, вероятно, захотите [1..]:

    module Count where
    import Control.Monad.State
    
    count :: Int -> Int
    count c = c+1
    
    count' :: State Int Int
    count' = do
        c <- get
        put (c+1)
        return (c+1)
    
    main :: IO ()
    main = do
                -- purely functional, value-modifying (state-passing) way:
        print $ count . count . count . count . count . count $ 0
                -- purely functional, State Monad way
        print $ (`evalState` 0) $ do { 
                count' ; count' ; count' ; count' ; count' ; count' } 
    
    3
    ответ дан 10 revs, 3 users 86% 3 September 2018 в 15:09
    поделиться

    Как правило, у вас нет (и вам не нужно). Однако в интересах полноты.

    import Data.IORef
    main = do
        i <- newIORef 0       -- new IORef i
        modifyIORef i (+1)    -- increase it by 1
        readIORef i >>= print -- print it
    

    Однако любой ответ, в котором говорится, что вам нужно использовать что-то вроде MVar, IORef, STRef и т. Д., Неверно. Существует чисто функциональный способ сделать это, что в этом маленьком быстро написанном примере на самом деле выглядит не очень хорошо.

    import Control.Monad.State
    type Lens a b = ((a -> b -> a), (a -> b))
    setL = fst
    getL = snd
    modifyL :: Lens a b -> a -> (b -> b) -> a
    modifyL lens x f = setL lens x (f (getL lens x))
    lensComp :: Lens b c -> Lens a b -> Lens a c
    lensComp (set1, get1) (set2, get2) =         -- Compose two lenses
        (\s x -> set2 s (set1 (get2 s) x)        -- Not needed here
         , get1 . get2)                          -- But added for completeness
    
    (+=) :: (Num b) => Lens a b -> Lens a b -> State a ()
    x += y = do
        s <- get
        put (modifyL x s (+ (getL y s)))
    
    swap :: Lens a b -> Lens a b -> State a ()
    swap x y = do
        s <- get
        let x' = getL x s
        let y' = getL y s
        put (setL y (setL x s y') x')
    
    nFibs :: Int -> Int
    nFibs n = evalState (nFibs_ n) (0,1)
    
    nFibs_ :: Int -> State (Int,Int) Int
    nFibs_ 0 = fmap snd get -- The second Int is our result
    nFibs_ n = do
        x += y       -- Add y to x
        swap x y     -- Swap them
        nFibs_ (n-1) -- Repeat
      where x = ((\(x,y) x' -> (x', y)), fst)
            y = ((\(x,y) y' -> (x, y')), snd)
    
    6
    ответ дан Will Ness 3 September 2018 в 15:09
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: