このドロップダウンのコンパイルを取得できました:
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