行けました!
追加したら動くました。ありがとうございます!
deriving instance ToFormKey a => ToFormKey (Identity a)
追加したら動くました。ありがとうございます!
deriving instance ToFormKey a => ToFormKey (Identity a)
Identity
のインスタンスを持たず、 extensible
のソースでもインスタンスを作っていないように見えるですがどういう仕組みなんでしょうIdentity
にくるんで runIdentity
で剥がすみたいなことができないでしょうか?hofM
の実装に依りますが、型だけ見ると hof
の時点で f :: a -> m b
を渡せませんか?Prelude> let hof a ab = ab a Prelude> :i hof hof :: t1 -> (t1 -> t) -> t Prelude> let hof' = hof "hello" print Prelude> hof' "hello" Prelude> :i hof' hof' :: IO ()
hof::Integer->(Integer->[String])->[String] hof init f = let result = f init in case length result > 5 of True -> result ++ (hof (init+1) f) False -> result
{-# OPTIONS_GHC -fno-warn-simplifiable-class-constraints #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE OverloadedStrings #-} import qualified Data.Extensible as E import Lens.Micro ((^.)) hoge :: E.Associate "pageId" String e => E.Record e -> IO () hoge e = do let (h : _) = (e ^. #pageId) print (h :: Char)
test.hs:20:25: error: • Couldn't match type ‘E.Elaborate "pageId" (E.FindAssoc 0 "pageId" e)’ with ‘'E.Expecting (n0 'E.:> [Char])’ arising from the overloaded label ‘#pageId’ The type variable ‘n0’ is ambiguous • In the second argument of ‘(^.)’, namely ‘#pageId’ In the expression: (e ^. #pageId) In a pattern binding: (h : _) = (e ^. #pageId) • Relevant bindings include e :: E.Record e (bound at test.hs:19:6) hoge :: E.Record e -> IO () (bound at test.hs:19:1) | 20 | let (h : _) = (e ^. #pageId) | ^^^^^^^
e
のどの位置に “pageId” があるかをtype familyで調べ,その位置をambiguousに型レベルの情報としてキャプチャし,それを用いてMembershipという情報を作ります.(^. #pageId)
(IsLabelの制約)で必要な位置情報が同じであることがGHCには分からず( e
が多相であるため,位置情報を一意に決定できないため),IsLabelの制約の方が位置情報が分からない( n0
は位置情報をGHCが一時的にmono化した変数で,この変数はAssociateの情報からキャプチャできるのですが,そのような推論をGHCからできないので怒られている)Membership
情報をAssociate制約から取ってきて( association
メソッドを呼び出して)それを明示的に使用するか,Associate制約を使ったユーティリティを使用することだと思います(が,extensibleそんなに使ったことがないので,他に解決策があるかもしれません)e ^. #pageId
の結果を別の変数に束縛すると解決できましたhoge :: E.Associate "pageId" String e => E.Record e -> IO () hoge e = do let s :: String s = e ^. #pageId (h : _) = s print (h :: Char)
(e ^. #pageId) :: String
と書いても同じエラーになってしまうんですよねぇ :disappointed:hoge :: E.Associate "pageId" String e => E.Record e -> IO () hoge e = do let h :: Char (h : _) = e ^. #pageId print h
hoge :: E.Associate "pageId" String e => E.Record e -> IO () hoge e = do let (h : _) = e ^. #pageId :: String print h
fx = g (x+1) "newvalue"
f x = g (x+1) "newvalue"
f :: Int -> IO () f x = writeFile (show (x+1)) =<< readFile (show x)
ForeignObj#
はいったい何だろう、ググっても、GHCのgitを全部検索しても見つからない https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ffi-chap.html#unboxed-types:: Int
を推論してもらうことはできないのでしょうか?Intを受け取るものしか定義していないのでしてくれても良さそうに感じるのですが…"languageServerHaskell.trace.server": "verbose"
でなんか出ます。