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 -> vFieldName 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ってなんかあったりするのでしょうか?