行けました!
追加したら動くました。ありがとうございます!
        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" でなんか出ます。