2011-07-05 30 views
5

Như Erlang là một ngôn ngữ lập trình chức năng gần như tinh khiết, tôi tưởng tượng này là có thể:Erlang mô hình kết hợp với các chức năng

case X of 
    foo(Z) -> ... 
end. 

nơi foo(Z) là một decidable-nghịch tinh khiết (tác dụng phụ phí) song ánh chức năng, ví dụ:

foo(input) -> output. 

Sau đó, trong trường hợp đó X = output, Z sẽ phù hợp như input.

Có thể sử dụng ngữ nghĩa như vậy, có hoặc không có cú pháp khác so với ví dụ của tôi, trong Erlang?

Trả lời

1

Không, Erlang chỉ hỗ trợ mô hình đen!

Và yêu cầu ban đầu của bạn không phải là một yêu cầu dễ dàng. Chỉ vì có một nghịch đảo không có nghĩa là nó dễ tìm. Thực tế nó sẽ là trình biên dịch sẽ phải thực hiện hai phiên bản của các hàm.

4

Không, những gì bạn muốn là không thể.

Để làm điều gì đó như thế này, bạn sẽ cần có khả năng tìm thấy nghịch đảo của bất kỳ chức năng sinh học nào, điều này rõ ràng là không thể xác định được.

+3

@Pindatjuh: Tôi biết hàm bijective là gì. Nhưng chỉ vì mỗi hàm bijective có một nghịch đảo không có nghĩa là bạn có thể viết một thuật toán để tìm nó (bạn không thể). – sepp2k

+0

Tôi sẽ chỉnh sửa câu hỏi: một chức năng bijective tinh khiết không thể đảo ngược. – Pindatjuh

2

Tôi đoán lý do tại sao điều đó không được phép là bạn muốn đảm bảo thiếu tác dụng phụ. Với cấu trúc sau:

case Expr of 
    Pattern1 [when GuardSeq1] -> 
     Body1; 
    ...; 
    PatternN [when GuardSeqN] -> 
     BodyN 
end 

Sau khi bạn đánh giá Expr, các mô hình được tuần tự khớp với kết quả của Expr. Hãy tưởng tượng chức năng foo/1 của bạn có chứa một tác dụng phụ (ví dụ nó sẽ gửi một thông điệp):

foo(input) -> 
    some_process ! some_msg, 
    output. 

Ngay cả khi mô hình đầu tiên sẽ không phù hợp, bạn đã có thể gửi tin nhắn anyway và bạn không thể phục hồi từ tình huống đó.

+0

Cảm ơn, tuy nhiên tôi có nghĩa là với "chức năng thuần túy" rằng nó không được phép có tác dụng phụ. Tôi sẽ chỉnh sửa câu hỏi. – Pindatjuh

+1

Tôi hiểu điều đó. Vấn đề, tuy nhiên, là làm thế nào để đảm bảo chức năng là tinh khiết, khi nó được người dùng định nghĩa. –

1

Những gì bạn có thể làm là:

Y = foo(Z), 
case X of 
    Y -> ... 
end. 
+2

Điều đó đòi hỏi bạn phải biết giá trị của Z mặc dù. Tôi khá chắc chắn đó không phải là những gì OP dự định. – sepp2k

+0

Vâng, nếu một thay thế 'foo' bằng' foo_inverse', điều đó có ý nghĩa. Tuy nhiên, như sepp2k đã nói, đó không phải là những gì tôi dự định. – Pindatjuh

Các vấn đề liên quan