hexirp
ghc-paths-0.1.0.9: using precompiled package
ghc-pkg.EXE: cannot find package ghc-paths-0.1.0.9
ghc-pkg.EXE: cannot find package ghc-paths-0.1.0.9
Associate k v xs => FieldName k -> Record xs -> v
FieldName k
はざっくりいうと Optic
の 型シノニムなので普通のlensや mkField
で作られたフィールドらしくrecord ^. field
みたいな式で取り出せるかな、と思ったのですが、app\record-placeholder.hs:53:23: error: • Couldn't match type ‘LabelPhantom k1 (Inextensible (Field Proxy) '[k1 ':> ()]) (Proxy (Inextensible (Field Proxy) '[k1 ':> ()]))’ with ‘Record xs -> Const a0 (Record xs)’ Expected type: Control.Lens.Getter.Getting a0 (Record xs) a0 Actual type: FieldName k1
FieldName
は #field
のように OverloadedLables
で多相化された状態ではなく、 field :: FieldName k
という型の変数として渡されます。FieldName k
以外の型にした方がいいんだろうか...訊
https://hackage.haskell.org/package/extensible-0.4.9/docs/Data-Extensible-Label.html#v:-35338- FieldName k
を引数に取って、 hlookup (associate :: Membership xs (k ':> v)
と書くのがよさそうですFieldOptic k
を引数にすると v
の型がうまく定まらないのかコンパイルエラーになってしまったので、rec ^. itemAssoc (Proxy :: Proxy k)
と書いて解決しました。Associate k v xs =>
というコンテキストだったので)data Free f a = Pure a | Free (f (Free f a)) deriving Functor
data Tree a = Node a Tree Tree | Leaf a
data T a = N a (T a) (T a) | L a
*
が必要import Data.Type.Bool import Data.Type.Equality someFun :: (a == Foo || a == Bar) ~ True => ...
{-# LANGUAGE ConstraintKinds, TypeFamilies #-} import Data.Constraint data Foo data Bar type family IsFooOrBar x :: Constraint where IsFooOrBar Foo = () IsFooOrBar Bar = () IsFooOrBar x = Bottom someFun :: (IsFooOrBar a, Monad m) => m a someFun = undefined
{ "tickets":[], "next_page": some_url }
{ "users":[], "next_page": some_url }
.hs
で出力できるの?例えば{-# LANGUAGE TemplateHaskell #-} module Foo where import Language.Haskell.TH.Syntax foo = $(lift ("foo" ++ "bar"))
{-# LANGUAGE TemplateHaskell #-} module Foo where import Language.Haskell.TH.Syntax foo = "foobar"
-ddump-splices
というオプションで、生成したソースを書き出すことはできますが、 .hs
として直接コンパイルできるものではありません。hasktags
を使ってました。色々あるのね。xs = [1..] :: [Int] let (x: _) = head $ drop 10 xs
ghci :etags
を使ってます。なんにも依存しない:sweat_smile:type family Fst (t :: (a, b)) :: a where Fst '(a, b) = a type family Snd (t :: (a, b)) :: b where Snd '(a, b) = b extractedTuple :: '(Fst a, Snd a) :~: a
extractedTuple
を unsafeCoerce
無しに実装する方法ってありますでしょうか?もしくは,Fst/Sndの代用となるtype utilityってなんかあったりするのでしょうか?