3

このドロップダウンのコンパイルを取得できました:

bodyElementPracticeType :: MonadWidget t m => m ()
bodyElementPracticeType = el "div" $ do
  el "h2" $ text "Dropdown"
  text "Select sport "
  dd <- dropdown Solo_Workout (constDyn (Map.fromList [(e, showSoloPersonPracticeType e) | e <- [minBound..]])) def
  el "p" $ return ()
  let selItem = result <$> value dd 
  dynText selItem 

result :: SoloPersonPracticeType -> T.Text
result e = fromJust $ Map.lookup e $ Map.fromList [(e, showSoloPersonPracticeType e) | e <- [minBound..]]

data SoloPersonPracticeType = 
        Solo_Workout 
    |   Solo_Run

showSoloPersonPracticeType :: SoloPersonPracticeType -> T.Text 
showSoloPersonPracticeType = \case 
    Solo_Workout -> T.pack "Workout"
    Solo_Run -> T.pack "Run"

deriving instance Enum SoloPersonPracticeType 
deriving instance Bounded SoloPersonPracticeType 
deriving instance Eq SoloPersonPracticeType 
deriving instance Ord SoloPersonPracticeType 

instance Universe SoloPersonPracticeType where 
    universe = [minBound..]

しかし、私は Obelisk のフレームワーク内で作業しているので、そこで指定された構造内にウィジェットを配置するためにいくつかの変更を試みました。

frontend :: Frontend (R FrontendRoute)
frontend = Frontend
  { _frontend_head = do
      el "title" $ text "The App Name"
      elAttr "link" ("href" =: static @"bulma.css" <> "type" =: "text/css" <> "rel" =: "stylesheet") blank
  , _frontend_body = subRoute_ $ \case 
        FrontendRoute_Main -> do
            -- bodyElementPracticeType :: MonadWidget t m => m ()
            let bodyElementPracticeType = el "div" $ do
                el "h2" $ text "Dropdown"
                text "Select sport "
                dd <- dropdown Solo_Workout (constDyn (Map.fromList [(e, showSoloPersonPracticeType e) | e <- [minBound..]])) def
                el "p" $ return ()
                let selItem = result <$> value dd 
                dynText selItem 

                -- result :: SoloPersonPracticeType -> T.Text
                let result e = fromJust $ Map.lookup e $ Map.fromList [(e, showSoloPersonPracticeType e) | e <- [minBound..]]
                       return ()
  }

しかし、私はこのエラーが発生しています:

frontend/src/Frontend.hs:184:17-125: error:
    The last statement in a 'do' block must be an expression
      let result e
            = fromJust $ Map.lookup e
                $ Map.fromList
                    [(e, showSoloPersonPracticeType e) | e <- [minBound .. ]]
    |
184 |                 let result e = fromJust $ Map.lookup e $ Map.fromList [(e, showSoloPersonPracticeType e) 
| e <- [minBound..]]
    |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

エラーメッセージは明確ですが、1.これが正しいアプローチであるかどうかもわかりません.2.正しいアプローチである場合、この最後のlet result e = ...ビットをdoブロックに入れるにはどうすればよいですか?

resultまたは、関数を関数の外に移動すると、次のfrontendエラーが発生します。

frontend/src/Frontend.hs:177:17-41: error:
    • Could not deduce (Monad m0) arising from a do statement
      from the context: ObeliskWidget js t (R FrontendRoute) m
        bound by a type expected by the context:
                   forall js t (m :: * -> *).
                   ObeliskWidget js t (R FrontendRoute) m =>
                   RoutedT t (R FrontendRoute) m ()
        at frontend/src/Frontend.hs:(61,12)-(230,3)
      or from: a ~ ()
        bound by a pattern with constructor:
                   FrontendRoute_Main :: FrontendRoute (),
                 in a case alternative
        at frontend/src/Frontend.hs:174:9-26
      The type variable ‘m0’ is ambiguous
4

0 に答える 0