重要なアドバイス
Learn You a Haskell for Great Good に取り組む価値は十分にあります。素晴らしいチュートリアルです。
練習!遊ぶ!ブリーフを変更して、この割り当てを拡張します。整数の代わりに文字列に対してそれを行うことはできますか? 3 つのサブツリーを持つツリーを作成できますか? ブランチにもデータがある場合はできますか? 任意のデータ型を取るツリーを作成できますか? sについて調べてFunctor
ください。なぜ彼らは良いのですか?計算を表すツリーを作成できますか。枝は演算など+
に、葉は数字に対応しますか?
プレイすればするほど、自信がつきます。何かが起こる前にそれを知ったクラスの男になりましょう。誰もがあなたに助けを求めますが、グループの誰かが抱えている難しい問題を解決するように求められると、さらに多くのことを学ぶことができます。
質問 1: ツリーのデータ型
ここにいくつかのヒントがあります。
このバイナリ ツリーには、2 つのサブツリーまたはブール リーフがあります。
data BTree = Leaf Bool | Branch BTree BTree
deriving (Eq,Show)
このデータ構造には、 のリストを含む 3 つの項目がありますBool
。
data Triple = Triple Int String [Bool]
deriving (Eq,Show)
これは 3 つの異なる可能性がありExpr
、右側に表示されるため、少し木に似ています。
data Expr = Var Char | Lam Char Expr | Let Char Expr Expr
deriving (Eq,Show)
ここで、3 つの可能性を持つ 1 つが必要です。リーフには整数のリストがあり、他の 2 つには 1 つまたは 2 つのサブツリーがあります。例のアイデアをまとめます。
質問 2: ツリーに関数をマップする
これを、関数を「マップ」することができるあらゆる場所に関数を適用することと呼びます。map
リストに対してfmap
それを行い、他のものに対してそれを行います。
Bool -> Bool
を受け取り、最初の例にマップする関数を定義しましょう。
mapBTree :: (Bool -> Bool) -> BTree -> BTree
mapBTree f (Leaf b) = Leaf (f b)
mapBTree f (Branch b1 b2) = Branch (mapBTree f b1) (mapBTree f b2)
もう 1 つはトリプルにマップされます。今回はBool
、リスト内の各 で機能させる必要があります。
mapBoolTriple :: (Bool -> Bool) -> Triple -> Triple
mapBoolTriple f (Triple i xs bs) = Triple i xs (map f bs)
map
次のように機能する標準関数を使用したことに注意してください。
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
したがって、リストの先頭から順に適用さf
れます。x
私は本当にこの種のことをどのように行うか
しかし、これは私が実際にこれを行う方法ではありません。追加します
{-# LANGUAGE DeriveFunctor #-}
ファイルの先頭に
data BinTree a = ALeaf a | ABranch (BinTree a) (BinTree a)
deriving (Eq, Show, Functor)
そして、私はできる
fmap (*100) (ABranch (ALeaf 12) (ALeaf 34))
それは私に与えるだろう
ABranch (ALeaf 1200) (ALeaf 3400)
しかし、fmap
より柔軟です: 私も行うことができます
fmap (<20) (ABranch (ALeaf 12) (ALeaf 34))
-- ABranch (ALeaf True) (ALeaf False)
また
fmap show (ABranch (ALeaf 12) (ALeaf 34))
-- ABranch (ALeaf "12") (ALeaf "34")
関数を 1 行も書かずにfmap
。追加の言語機能を使用する場合は 10/10 になりますが、設定どおりに問題を解決する場合は 0/10 になると思います。
さらなるアドバイス
楽しく Haskell を学びましょう。時には気が遠くなるようなこともあるかもしれませんが、学ぶことに対して大きな報酬を与えてくれます。Haskell でいくつかのプログラムを書くと、従来の言語で書いたプログラムよりも 10 分の 1 の長さになります。もっと考えて!書く量を減らしてください!