जीएचसीआई का उपयोग करते समय कार्यों के लिए स्पष्ट प्रकार की घोषणाएं कैसे प्रदान करें?


82

मैं GHCi के अंदर इस फ़ंक्शन ( learnyouahaskell से लिया गया ) के बराबर कैसे परिभाषित करूं ?

import Data.List  

numUniques :: (Eq a) => [a] -> Int  
numUniques = length . nub  

प्रकार की घोषणा के बिना, GHCi फ़ंक्शन परिभाषा को स्वीकार करता है, लेकिन यह एक अनहेल्दी प्रकार के साथ समाप्त होता है:

Prelude Data.List> import Data.List 
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int

परिणामी फ़ंक्शन केवल एक पैरामीटर के रूप में इकाइयों की सूची को स्वीकार करता है।

क्या जीएचसीआई में एक तरह से घोषणाएं उपलब्ध हैं? या फिर इन जैसे कार्यों को परिभाषित करने का एक और तरीका है जिसके लिए प्रकार की घोषणाओं की आवश्यकता नहीं है?

मैंने GHCi गाइड में कोई स्पष्ट सुराग नहीं देखा, और निम्न (कोई फायदा नहीं हुआ) जैसे भावों के साथ प्रयोग किया:

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int

जवाबों:


101

क्या जीएचसीआई में एक तरह से घोषणाएं उपलब्ध हैं?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub

या फिर इन जैसे कार्यों को परिभाषित करने का एक और तरीका है जिसके लिए प्रकार की घोषणाओं की आवश्यकता नहीं है?

यदि आप मोनोमोर्फिज्म प्रतिबंध को बंद कर देते हैं -XNoMonomorphismRestriction, तो यह सही प्रकार का अनुमान लगाएगा।


3
मैं अभी तक मोनोमोर्फिज्म के साथ नहीं हूं, लेकिन आम तौर पर इस जवाब ने मुझे GHCi में परिभाषाओं को एक साथ करने के लिए अर्धविराम का उपयोग करने के लिए कहा - ट्यूटोरियल एक .hs फ़ाइल की तरह लिखे जाते हैं, जो GHCi में किए गए कई अलग-अलग समस्याओं को देता है (फ़ंक्शन बंधन आदि का अभाव है)। ।)।
टॉमस गैंडर

यह ध्यान देने योग्य है कि -XNoMonomorphismRestrictionGHCi के लिए डिफ़ॉल्ट रूप से 7.8.1 से सक्षम है: downloads.haskell.org/~ghc/latest/docs/html/users_guide/…
N. Shead

13

ध्यान दें कि आप अपनी अभिव्यक्ति में केवल "अंक" (यानी स्पष्ट चर) जोड़कर मोनोमोर्फिस्म प्रतिबंध से बच सकते हैं। तो यह भी सही प्रकार देता है:

संख्याओं को x = लंबाई दें। नब $ x


1
धन्यवाद - यह जानकर बहुत अच्छा लगा।
मटभ

इसे एटा-विस्तार के रूप में जाना जाता है
ब्लैड

3

GHC उपयोगकर्ता की मार्गदर्शिका इसे प्राप्त करने के दो अतिरिक्त तरीके दिखाती है। इस उपधारा का परिचय :{... :}निर्माण, जो निम्नानुसार किया जा सकता है:

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}

वैकल्पिक रूप से, आप मल्टीलाइन मोड को सक्षम कर सकते हैं :

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.