そこで、この関数に 2 つのパラメーターを入れたいと思います。リストと、印刷したいアイテムの位置です。
listNumber [1,2,3,4,5,6] 2
>> 3
私はこれを行うことでこの問題を試しました
numberList :: (List a) => a -> a -> a
numberList a b = [x | x <- a !! n, n <- b]
私のミスがどこにあるのかわからない。
そこで、この関数に 2 つのパラメーターを入れたいと思います。リストと、印刷したいアイテムの位置です。
listNumber [1,2,3,4,5,6] 2
>> 3
私はこれを行うことでこの問題を試しました
numberList :: (List a) => a -> a -> a
numberList a b = [x | x <- a !! n, n <- b]
私のミスがどこにあるのかわからない。
これは面白いやり方だと思います。
今のところ型アノテーションを無視して関数を見ると、次のようになります。
numberList a b = [x | x <- a !! n, n <- b]
リスト内包表記の最初の条件でnが呼び出されていることがわかります。
x <- a !! n
ただし、nはその後、2番目の条件でのみ定義されます。
n <- b
これはエラーにつながります:スコープ外: `n '
したがって、最初に行うことは、最初と2番目の条件を切り替えることかもしれません。
numberList a b = [x | n <- b, x <- a !! n]
タイプについてGHCiに尋ねると、次のようになります。
Prelude> :t numberList
numberList :: [[t]] -> [Int] -> [t]
GHCは、パラメーターaがリストのリストであり、パラメーターbがintのリストであることを想定しています。これは、nがbから引き出され、リスト内包表記の<-の右側にあるものはすべてリストでなければならないためです。nは!!のパラメーターとして使用されるため、GHCはnがintであり、bがintのリストであると想定します。
現在、GHCは、xもある種のリストからのものであると想定しています。したがって、GHCは!!を想定していることがわかります。nはリストです。しかし、定義上、!! nは位置nのリストaの要素であり、GHCがaをリストのリストと見なす理由がわかります。GHCは位置nのリストaの要素を、xが描画されるリストであると想定しているためです。
実例は次のとおりです。
Prelude> numberList [[1,2,3,4,5,6]] [0]
[1,2,3,4,5,6]
ここでGHCは実際に、リスト[1..6]である位置0のリストaの要素を示しています。残念ながら、これでは、希望どおりにリスト内の位置に簡単に移動することはできません。リスト内包表記を引き続き使用する別の方法は、次のように、後の要素(a !! n)を含む新しいリスト'c'を定義し、この新しいリストからxを描画することです。
Prelude> let numberList a b = [x | n <- b, let c = [a !! n], x <- c]
Prelude> numberList [1,2,3,4,5,6,3] [2]
[3]
ただ、簡単に使えるので少し複雑そうです!! 位置bにあるaの要素を直接取得するには:
Prelude> let numberList a b = a !! b
Prelude> numberList [1,2,3,4,5,6] 2
3
そこで、この関数に 2 つのパラメーターを入れたいと思います。リストと、印刷したいアイテムの位置です。
>>> listNumber [1,2,3,4,5,6] 2
3
わかった。ステップ 1: 本当にめちゃくちゃな型シグネチャがあります。
numberList :: (List a) => a -> a -> a
これを無視してはなりません。優れた型シグネチャから始めることは、Haskell や類似の言語で優れたプログラミング手法を習得するために不可欠なスキルです。
まず、2 つの入力を持つ関数が必要です。
numberList :: a -> b -> c
次に、最初の入力を「リスト」にします。このリストに何が含まれているか分からないので、 type parameter のみを使用しますa
。「のリスト」の書き方a
は[a]
.
numberList :: [a] -> b -> c
2 番目の入力を「位置」にする必要があります。これはおそらくInt
.
numberList :: [a] -> Int -> c
最後に、結果をリストの要素にする必要があります。したがって、同じタイプになりa
ます。
numberList :: [a] -> Int -> a
型シグネチャのその部分をどこで入手した(List a) =>
のかわかりませんが、私たちに教えていないカスタムライブラリを使用していない限り、それは完全に偽物です. これは、大学で Haskell のコースを受講している場合に可能です。
型シグネチャがあり、これが既に実装されているかどうかを知ると便利です。止まる!ホーグルタイム。型シグネチャ[a] -> Int -> a
をhttp://haskell.org/hoogleに入力します。を実装しようとしていることがわかりました!!
。