यह समस्या एक मॉड्यूल में उभरी है जो मैं लिख रहा हूं, लेकिन मैंने एक मामूली मामला बनाया है जो एक ही व्यवहार को प्रदर्शित करता है।यहां अनुमान लगाने का काम क्यों नहीं करता है?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
समस्या यह है कि संकलक Minimal
(Int
) के लिए आंतरिक पैरामीटर यह पता लगाने में सफल हुआ है, लेकिन फिर Nothing
को T
के अन्य घटना है, जो स्पष्ट रूप से apply
से मेल नहीं खाता सेट। ये निश्चित रूप से वही T
हैं, क्योंकि पहले पैरामीटर को हटाने से दूसरा शिकायत करता है कि टी परिभाषित नहीं है।
क्या कुछ अस्पष्टता है जिसका मतलब है कि संकलक पहले पैरामीटर का अनुमान नहीं लगा सकता है, या यह एक बग है? क्या मैं इस खूबसूरत तरीके से काम कर सकता हूं?
अधिक जानकारी: यह कोड वाक्य रचनात्मक चीनी के प्रयास का एक साधारण उदाहरण है। मूल कोड |(a)|
बनाने का प्रयास करता है जिसका मतलब a
का मॉड्यूलस है, जहां एक वेक्टर है। स्पष्ट रूप से |(a)|
|[Float,Vector3[Float]](a)|
लिखने से बेहतर है, लेकिन दुर्भाग्य से मैं इसे आसान बनाने के लिए unary_|
का उपयोग नहीं कर सकता।
वास्तविक त्रुटि:
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
हां, यह समाधान मेरे मामले में ठीक काम करता है। यह यहोशू के समाधान से भी साफ है (क्षमा करें यहोशू!)। क्या आप समझा सकते हैं कि यहोशू का समाधान क्यों काम करता है? – Dylan
उत्तर देने के लिए उत्तर दिया गया कि यहोशू का समाधान भी क्यों काम करता है। –