Haskell Mencoba membuat fungsi lipat saya berfungsi

Saya memiliki fungsi yang mengubah [a, b, c, d, . . . ] ke [(a,b), (c, d), . . .]. Sekarang ini berfungsi dan ini kode untuk itu:

makeTuple :: [a] -> [(a,a)]
makeTuple [] = []
makeTuple [a] = []
makeTuple (x:y:xs) = (x,y): (makeTuple xs)

Sekarang hal berikutnya yang harus saya lakukan adalah ini: Menggunakan fungsi sebelumnya, ubah setiap tupel menjadi produk dari dua elemennya, menggunakan lipatan dan ekspresi lambda. Dan inilah yang saya punya:

productTuple [x] = foldl makeTuple [] [x]

Sekarang saya tidak yakin apakah ini tepatnya yang diminta dari saya. Saya tidak yakin apakah saya harus membuat fungsi terpisah dengan deklarasi tipe dan yang lainnya. Mungkin seseorang dapat memberi tahu saya apakah itu cara terbaik untuk melakukan pendekatan ini. Kode ini juga tidak berfungsi, dan saya tidak tahu mengapa, saya memerlukan bantuan untuk bagian ini. (perhatikan bahwa dikatakan menggunakan lambda, tetapi saya tidak tahu cara menggunakannya dengan benar, yang merupakan bagian lain yang memerlukan bantuan) Saya akan sangat menghargainya, terima kasih.


person lou tej    schedule 02.11.2017    source sumber
comment
Siapa bilang Anda harus menggunakan fungsi makeTuple Anda?   -  person Willem Van Onsem    schedule 02.11.2017
comment
Anda mungkin harus mengimplementasikan kasus productTuple yang kosong dan kontra, jadi productTuple (x:xs) dan productTuple [].   -  person altschuler    schedule 02.11.2017
comment
Petunjuk: bagaimana Anda menggunakan foldl yang memasukkan daftar, untuk membuat ulang daftar itu (jadi pada dasarnya fungsi id)?   -  person Willem Van Onsem    schedule 02.11.2017
comment
terkait: stackoverflow.com/q/26017352/67579   -  person Willem Van Onsem    schedule 02.11.2017


Jawaban (2)


Fungsi lambda harus menghormati tanda tangan ini:

 [a] -> (b,b) -> [a]

Akumulator bertipe [a], tuple bertipe (b,b)

Anda dapat mencoba lambda seperti ini \acc (a, b) -> acc++[a*b]

Fungsi terakhirnya akan terlihat seperti:

productTuple :: Num a => [a] -> [a]
productTuple xs = foldl (\acc (a, b) -> acc++[a*b]) [] (makeTuple xs)

Anda memiliki beberapa contoh fungsi lipat di sini

Saya mencoba kode ini di sini

person Arno    schedule 02.11.2017

Latihan ini meminta Anda untuk memproses terlebih dahulu daftar masukan dengan makeTuple, lalu melipatnya.

productTuple :: [Int] -> [Int]
productTuple xs = foldl (some lambda) something (makeTuple xs)

Ini bukan cara yang paling nyaman untuk melakukannya, tapi menurut saya inti dari latihan ini adalah memaksa Anda menggunakan foldl hanya demi itu.

person chi    schedule 02.11.2017
comment
Penggunaan makeTuple OP Anda menyebabkan kesalahan tipe: hanya membutuhkan satu daftar sebagai argumen. - person gallais; 02.11.2017