これは他の人の言われたことと変わりませんが、ポイントは苦労するべきでしょうか?リストには2つの基本的な 'コンストラクタ'があります。したがって、リストから関数を定義する際に考慮する必要がある2つの基本的なケース:[]
と(:)
の引数。後者の(:)
は、そのような種類のリストを持つものに参加することができます。したがって、1
は[]
- 1:[]
または[1]
です。それとも、1
に1:(1:[])
のようなもの、つまり1:[1]
、すなわち[1,1]
という特別な構文を使用して書くことができます。
data List a = Nil | Cons a (List a) deriving (Show, Eq, Ord)
[]
とx:xs
の使用は、このような何かのためだけスワンク糖である
:
あなた自身が、書き込みがリストを定義していた場合は間違っていただろうかより明らかであろう。同様に、特別なString
砂糖は['a','b','c']
ではなくと書くことができます。これは'a':'b':'c':[]
よりも優れています。 (上記の定義では、短い文字列の場合は少し多いですが、ByteString
とText
の表現を多くの目的で使用する理由がありますが、Cons 'a' (Cons 'b' (Cons 'c' Nil)))
と書く必要があります。)このような、より詳細なリストの定義では、我々は我々自身map
(というかfmap
)、私たちはこのような場合のためにfmap
を定義する際に、私は、コンストラクタの両方のタイプを考慮しなければならなかったこと
instance Functor List where
fmap f Nil = Nil
fmap f (Cons first rest) = Cons (f first) (fmap f rest)
お知らせを言うことができる追加する必要があります私のリストタイプの場合は、Nil
とCons first rest
(またはCons x xs
と書かれていることが多い)。
それともあなたはLYAHでFunctor
型クラスの一般的な議論にまで持っていない - その場合には、ちょうど、あなたはどのような場合には、独自のmap
として
listMap f Nil = Nil
listMap f (Cons first rest) = Cons (f first) (listMap f rest)
を定義することができることを考えますリスト型のこの脱糖書き換え与え、あなたの実際の関数の定義は次のようになります。あなたがカバーしている
apply :: (Num b, Ord b) => (a -> a) -> b -> List a -> List a
apply f n Nil = Nil
apply f n (Cons first Nil)
| n <= 1 = fmap f (Cons first Nil) -- or listMap f (Cons first Nil)
| otherwise = apply f (n-1) (fmap f (Cons first Nil))
例は以下のとおりです。
apply f n Nil
apply f n (Cons first Nil)
Cons first Nil
は、first : []
または[first]
と同じです(つまり、[x]
)。しかし、これはあなたがすべてのケースをカバーしていないことを意味し、あなたの定義は「徹底的でない」ことです。複数のメンバーがある場合は、f
とn
をリストに適用する方法については言及していません。リストの形式がNil
(最初の行)またはCons x Nil
(2行目)ではなく、Cons x (Cons y Nil)
またはCons x (Cons y (Cons z Nil))
の場合はどうなりますか?
ソリューションは、他の人が言ったようである、または当社の脱糖リスト型を使用して:
apply :: (Num b, Ord b) => (a -> a) -> b -> List a -> List a
apply f n Nil = Nil
apply f n (Cons first rest)
| n <= 1 = fmap f (Cons first rest)
| otherwise = apply f (n-1) (fmap f (Cons first rest))
ここで「変数」のrest
がNil
かどうか、すべてのリストをカバーしています。また
*Main> apply (+1) 3 Nil
Nil
*Main> apply (+1) 3 (Cons 3 Nil)
Cons 6 Nil
あなたと同じように、しかし:したがって、私たちが得る
*Main> apply (+1) 3 (Cons 0 (Cons 1 (Cons 2 Nil)))
Cons 3 (Cons 4 (Cons 5 Nil))
これは、問題のタイトルの名前を変更することをお勧めします。これは、パターンマッチングの問題であり、必ずしも高次関数である必要はありません。 –
OKです。それは今ですか?ありがとう! – albertoblaz