Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Meniru `fmap` Haskell dengan Berkesan dalam Go Menggunakan Generik?

Bagaimanakah Saya Boleh Meniru `fmap` Haskell dengan Berkesan dalam Go Menggunakan Generik?

Susan Sarandon
Susan Sarandonasal
2024-12-15 11:22:09392semak imbas

How Can I Effectively Emulate Haskell's `fmap` in Go Using Generics?

Meniru fmap dalam Go

Semasa cuba meniru gelagat pemetaan fungsi fmap dalam Go menggunakan generik dan kaedah, pembangun mungkin menghadapi jenis isu inferens di mana pelaksanaan tidak boleh mengakses jenis generik yang ditakrifkan dalam antara muka. Ralat ini berpunca daripada pengehadan kaedah Go dalam menggunakan jenis berparameter sebagai argumen di luar jenis penerima.

Untuk menangani kekangan ini, penyelesaian biasa ialah melaksanakan fmap sebagai fungsi peringkat atas dan bukannya kaedah. Dengan mengisytiharkan fmap di luar definisi jenis, ia mendapat akses kepada jenis generik yang diperlukan, membenarkan kefungsian pemetaan yang betul.

Pertimbangkan contoh berikut:

package main

import "fmt"

type S[A any] struct {
    contents A
}

func Fmap[A, B any](sa S[A], f func(A) B) S[B] {
    return S[B]{contents: f(sa.contents)}
}

func main() {
    ss := S[string]{"foo"}
    f := func(s string) int { return len(s) }
    fmt.Println(Fmap(ss, f)) // {3}
}

Pendekatan ini mematuhi jenis Go sistem sementara masih menyediakan fungsi pemetaan yang dikehendaki, walaupun melalui strategi pelaksanaan yang berbeza. Walau bagaimanapun, adalah penting untuk mempertimbangkan kesesuaian menterjemah konsep daripada bahasa lain kepada Go dengan cara yang dirasakan semula jadi dalam ekosistem Go.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meniru `fmap` Haskell dengan Berkesan dalam Go Menggunakan Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn