2009-12-16 17 views
5

मैं monads साथ एफ # में (संगणना भाव उर्फ) कर रहा है और मैं इस सरल पहचान इकाई ने लिखा है:एफ # में कस्टम गणना भाव

type Identity<'a> = 
    | Identity of 'a 

type IdentityBuilder() = 
    member x.Bind (Identity v) f = f(v) 
    member x.Return v = Identity v 
let identity = new IdentityBuilder() 

let getInt() = identity { return Int32.Parse(Console.ReadLine()) } 

let calcs() = identity { 
    let! a = getInt() // <- I get an error here 
    let! b = getInt() 
    return a + b } 

मैं त्रुटि मैं में हो रही है समझ में नहीं आता उल्लेखनीय लाइन:

यह अभिव्यक्ति प्रकार पहचान < की उम्मीद नहीं थी() ग

ख * 'मुझे लगता है कि इस getInt के रूप में कोई मतलब नहीं है मैं' एक> लेकिन यहाँ टाइप है ' स्पष्ट रूप से Identity<'a> प्रकार का मान है।

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?

उत्तर

9

गणना अभिव्यक्ति वाक्यविन्यास Bind चाहता है कि एक tupled, curried तर्क नहीं है। तो

member x.Bind((Identity v), f) = f(v) 

सभी हस्ताक्षर के लिए this article देखें।

+1

या भाषा spec के सेक्शन 6.4.10 देखें: http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html – Brian

+1

स्वयं को नोट करें: उस विकी को संशोधित करें पेज क्योंकि इसका कोई मतलब नहीं है;) – Juliet

3

समस्या आपके Bind फ़ंक्शन का प्रकार है - इसे घुमावदार तर्क नहीं लेना चाहिए। यदि आप इसे बदलते हैं:

member x.Bind (Identity v, f) = f(v) 

तो यह काम करना चाहिए।