Hàm a -> b -> (a -> b) ngắn nhất trong Haskell


19

Tôi đã nhận được câu hỏi sau đây trong một bài kiểm tra:

Viết hàm fvới loại sau a -> b -> (a -> b). abkhông nên bị ràng buộc trong bất kỳ ý nghĩa nào, mã càng ngắn thì càng tốt.

Tôi nghĩ ra f a b = \x -> snd ([a,x],b). Bạn có thể tìm thấy một cái gì đó nhỏ hơn?

Hiện tại người chiến thắng là: f _=(.f).const


Nếu một loại tổng quát hơn được cho phép : f = const const.
hammar

@hammar: hoặc f _ b _ = b, nhưng, đưa ra giải pháp trong câu hỏi, tôi nghi ngờ một loại tổng quát hơn không được phép.
Tikhon Jelvis

6
Nếu một loại tổng quát hơn được cho phép, tại sao không f = id?
Tom Ellis

7
Trong thực tế nếu một loại tổng quát hơn được cho phép thì đó f = flà một giải pháp, vì vậy tôi đoán các điều kiện về loại này rất quan trọng!
Tom Ellis

2
Một loại tổng quát hơn không được phép, giả định của bạn là chính xác.
Radu Stoenescu

Câu trả lời:


11

Ví dụ của bạn có thể được thu hẹp bằng cách loại bỏ chức năng ẩn danh ở phía bên tay phải:

f a b x = snd ([a,x],b)

Điều này hoạt động vì loại a -> b -> a -> btương đương với a -> b -> (a -> b)trong Haskell.


4
Sửa đổi ngắn hơn một chút:f a b x = snd (f x,b)
Ed'ka

5

Các chức năng f _=(.f).constthực sự là một loại tổng quát hơn f :: a -> b -> (a -> b), cụ thể là f :: a -> b -> (c -> b). Nếu không có chữ ký loại nào, hệ thống suy luận kiểu sẽ tạo ra một loại f :: a -> b -> (a -> b), nhưng nếu bạn bao gồm chữ ký loại f :: a -> b -> (c -> b)với định nghĩa chính xác, Haskell sẽ biên dịch nó mà không gặp sự cố và sẽ báo cáo các loại nhất quán cho các ứng dụng một phần của f. Có lẽ có một số lý do sâu sắc tại sao hệ thống suy luận kiểu này chặt chẽ hơn hệ thống kiểm tra loại trong trường hợp này, nhưng tôi không hiểu đủ lý thuyết thể loại để đưa ra lý do là tại sao điều này lại xảy ra. Nếu bạn không tin tưởng, bạn có thể tự mình thử nó.


có thể là như trường hợp f a b = f a a. nó là loại a -> a -> bmặc dù nó phù hợp với loại a -> b -> c. Đó là bởi vì nếu fkhông được cung cấp một loại, nó chỉ có thể sử dụng chính nó một cách đơn hình.
tự hào

Tôi không nghĩ rằng điều này quan trọng mặc dù
tự hào

4

Được ScopedTypeVariables, tôi đã đưa ra điều này:

f (_::a) b (_::a) = b

Nếu bạn thu nhỏ cả chức năng của tôi và của bạn, thì tôi là tóc ngắn hơn:

f(_::a)b(_::a)=b
f a b x=snd([a,x],b)

Tất nhiên, có lẽ bạn không được phép dựa vào ScopedTypeVariables: P.


3
Điều này không phải là ngắn như f _=(.f).const( do Sassa NF ). Mà cũng không cần ScopedTypeVariables.
đã ngừng quay ngược chiều

Hmm, ban đầu tôi nghĩ rằng điều này sẽ yêu cầu các đối số thứ nhất và thứ ba được liệt kê ...
Chris Taylor

@ChrisTaylor: Có quá nhiều OCaml trong tâm trí? :)
Tikhon Jelvis

Hah, phải thế! ;)
Chris Taylor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.