学習用途でしたら,ぜひ再帰版もがんばってみてください.(私なら,リストのリストを処理する再帰関数Aから,リストを処理する再帰関数Bを呼ぶ,みたいな方針にすると思います)
{-# LANGUAGE DataKinds #-} {-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE LiberalTypeSynonyms #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeOperators #-} import Data.Extensible (type (>:)) import qualified Data.Extensible as E type DebugEnvFields m = '[ "print" >: (forall a. Show a => a -> m ()) ] type DebugEnv m = E.Record (DebugEnvFields m)
print
関数相当のものを一旦 newtype
でラップしてあげればいけるんですね。type DebugEnvFields m = '[ "print" >: Printer m ] newtype Printer m = Printer (forall a. Show a => a -> m ())
-Wall
で警告を有効にしていれば、どのパターンを網羅していないのか教えてくれるので、参考にするとよいでしょう。listed.hs:10:1: warning: [-Wincomplete-patterns] Pattern match(es) are non-exhaustive In an equation for ‘secmap’: Patterns not matched: _ [] _ ([]:_:_) | 10 | secmap f [[]] = [[]] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
do
で書けるようにした、というのがHspecなのです。Vector (String, Int)
みたいなデータをちゃんと日本語入りで出力するのはどうしたらいいんでしょうか。show
を挟んだりすると文字列が数値表記になってしまいます。Addr#
-valued literal って各文字が <=0xFF
である文字列リテラルに #
を後置すれば良いんですよね? 特に、値としては改行コードを含めたくないがソースの読みやすさ上改行したいときには、 \
の 直後に改行をして、適切な数の空白文字のあと \
、そしてその後に続きを書けばいいんですよね?Addr#
中に大量の \x20
が出現してひっどいバグが出てきたので…。\x20
は現れないのに、 埋め込んだファイルの方を解析すると \x20
がバグをひき起こしているように見えるんですよね…。\
は改行文字と一緒に削除される(複数行 #define
を可能にするための処理)。Haskellの複数行文字列はこのC preprocessのあと \
と改行文字があるのを見て字句解析されるため、次の行の開始から \
までが文字列に含まれてしまう。\ <newline> <whitespace>* \
ではなく \ <whitespace>+ \
なので、 \
の後に空白文字を挟めば大丈夫、と書いてるのをどこかで見ましたが手元環境では見事死亡。GCCなら大丈夫、と書いてあったから、手元環境がclang (MacOS Catalina)であるせいかもしれない。{-# LANGUAGE CPP #-} str = "foo \\ \bar baz" main = print str
\ <newline>
→ empty\ <non-newline-whitespace>* <newline>
→ empty\ <whitespace>+ \
→ empty{-# LANGUAGE CPP #-} str0 = "J'ai mal \\ \a tete" str1 = "J'ai mal \\a tete" main = print $ str0 == str1
import Data.Data data ConstrK a where ConstrK :: Data a => Constr -> ConstrK a deriving (Eq, Show) instance Ord (ConstrK a) where compare (ConstrK x) (ConstrK y) = show x `compare` show y toConstrK :: Data a => a -> ConstrK a toConstrK x = ConstrK $ toConstr x
dataTypeConstrs $ dataTypeOf (undefined :: a)
とかで取れます.import Data.Barbie data FruitSkel f = Apple (f Int) | Orange (f String) | Banana (f Char) deriving (Generic, FunctorB, ConstraintsB) deriving instance AllBF Show f FruitSkel => Show (FruitSkel f) deriving instance AllBF Eq f FruitSkel => Eq (FruitSkel f) deriving instance AllBF Ord f FruitSkel => Ord (FruitSkel f) type Fruit = FruitSkel Identity type FruitK = FruitSkel (Const ()) toKind :: Fruit -> FruitK toKind = bmap $ const $ Const ()
Cabal file warning ***.cabal@0:0: version with tags
という警告が表示されるのですが、これってどういうことなんでしょうか? もしかして 0.1.0.0 とかではなく 0.1 とバージョンを設定しろってことですかね?