Nếu tôi có một thể hiện của Bifunctor[A,A]
bf, một chức năng f : A => A
và một giá trị Boolean
p
:Gọi một hàm trên một "mặt" của một Bifunctor phụ thuộc vào giá trị của một boolean
def calc[A, F[_,_]: Bifunctor](p: Boolean, bf: F[A, A], f: A => A): F[A, A] = {
val BF = implicitly[Bifunctor[F]]
BF.bimap(bf, (a : A) => if (p) f(a) else a, (a : A) => if (!p) f(a) else a)
}
Làm thế nào tôi có thể đặt điều này chính xác hơn (và rõ ràng)? Về cơ bản, tôi đang cố gọi hàm ở bên cạnh một số bifunctor (ví dụ: Tuple2
) phụ thuộc vào một số biến vị ngữ. Nếu vị là đúng, tôi muốn để lập bản đồ LHS và RHS nếu nó sai
val t2 = (1, 2)
def add4 = (_ : Int) + 4
calc(true, t2, add4) //should be (5,2)
calc(false, t2, add4) //should be (1,6)
Cho rằng tôi muốn sử dụng các bộ (như trái ngược với khái quát hơn
Bifunctor
), tôi dường như có thể sử dụng arrows như sau:
def calc[A](p: Boolean, bf: (A, A), f: A => A): (A, A)
= (if (p) f.first[A] else f.second[A]) apply bf
Vấn đề là tôi đang viết nội dung * inline * (nghĩa là tôi không muốn khai báo phương thức bổ sung), vì vậy tôi không muốn phải viết 'bf' hai lần, vì nó là (trong thực tế) kết quả của một lời gọi phương thức. Các giải pháp mũi tên tôi tìm thấy thực sự hoạt động thực sự tốt –
Tôi nên nói rằng tôi cũng muốn chỉ truy cập 'p' một lần là tốt –
Đối với giải pháp haskell, bạn không cần phải áp dụng kết quả cho bifunctor? Hoặc là tiềm ẩn? (Tôi không biết haskell) –