একাধিক লাইন জুড়ে কীভাবে একটি ফাংশন সংজ্ঞায়িত করবেন?


161

আমি ঘিচিতে একাধিক লাইন বিস্তৃত যে কোনও সাধারণ ক্রিয়াকলাপটিকে সংজ্ঞায়িত করার চেষ্টা করছি, উদাহরণস্বরূপ নিম্নলিখিতটি নিন:

let abs n | n >= 0 = n
          | otherwise = -n

এখনও পর্যন্ত আমি প্রথম লাইনের পরে এন্টার টিপতে চেষ্টা করেছি:

Prelude> let abs n | n >= 0 = n
Prelude>           | otherwise = -n
<interactive>:1:0: parse error on input `|'

আমি কমান্ডগুলি :{এবং :}কমান্ডগুলি ব্যবহার করার চেষ্টা করেছি কিন্তু আমি আর কাছে যাই না:

Prelude> :{
unknown command ':{'
use :? for help.

আমি লিনাক্সে হাসেল 98 এর জন্য জিএইচসি ইন্টারেক্টিভ সংস্করণ 6.6 ব্যবহার করছি, আমি কী অনুপস্থিত?


20
আপনার GHC ইনস্টলেশন আপগ্রেড করুন। জিএইচসি 6.6 এর বয়স প্রায় 5 বছর! হাস্কেলের সর্বশেষ সংস্করণগুলি এখানে রয়েছে: haskell.org/platform
ডন স্টুয়ার্ট


1
@ মার্ক এই ওপি ইতিমধ্যে সেই সমস্যার সমাধানের চেষ্টা করেছে। এই সমস্যাটি একটি মেয়াদোত্তীর্ণ গিগির কারণে, কী করবেন তার জ্ঞানের অভাবের কারণে। সমাধান এখানে: আপগ্রেড। সেখানে সমাধান: ব্যবহার :{, :}
অ্যান্ড্রুসি

উত্তর:


124

প্রহরীদের জন্য (আপনার উদাহরণের মতো), আপনি কেবল সেগুলিকে এক লাইনে রাখতে পারেন এবং এটি কার্যকর হয় (প্রহরীরা স্পেসিংয়ের বিষয়ে চিন্তা করে না)

let abs n | n >= 0 = n | otherwise = -n

আপনি যদি একাধিক সংজ্ঞা দিয়ে আপনার ফাংশনটি লিখতে চেয়েছিলেন যে আর্গুমেন্টগুলির সাথে এই প্যাটার্নটি মেলে, যেমন:

fact 0 = 1
fact n = n * fact (n-1)

তারপরে আপনি সেমিকোলনের সংজ্ঞাগুলি পৃথক করে ব্রেস ব্যবহার করবেন

let { fact 0 = 1 ; fact n = n * fact (n-1) }

258

GHCi এখন একটি মাল্টলাইন ইনপুট মোড রয়েছে: সেট + এম দিয়ে সক্রিয়। উদাহরণ স্বরূপ,

Prelude> :set +m
Prelude> let fac 0 = 1
Prelude|     fac n = n * fac (n-1)
Prelude|
Prelude> fac 10
3628800

39
মাল্টলাইন মোড সেট করা ghciএই ক্ষেত্রে পাইথন ইন্টারপ্রেটারের মতো আচরণ করে। খুব সুবিধাজনক! আপনি প্রকৃতপক্ষে .ghciআপনার হোম ডিরেক্টরিতে একটি ফাইল তৈরি করতে পারেন যা আপনি রেখেছিলেন :set +mএবং প্রতিবার আপনি যখনই শুরু করবেন তখন মাল্টলাইন মোড ডিফল্ট হয়ে যাবে ghci!
kqr

2
এটি সত্যিই দুর্দান্ত। কিন্তু আমি খেয়াল করেছি যে, যখন আমি ব্যবহার করে আমার প্রম্পট সেট :set prompt "λ "অব্যাহত লাইন বলতে Preludeপরিবর্তে λ। এই কাছাকাছি পেতে কোন উপায়?
অবহেলমান

2
এখানে প্যাচ একটি নতুন ধারাবাহিকতা প্রম্পট সংজ্ঞায়িত করতে দেখুন ghc.haskell.org/trac/ghc/ticket/7509#no1
karakfa

4
ধারাবাহিকতা লাইনে প্রিলিউড উপস্থিত হওয়া রোধ করতে, আপনার .gci এ প্রম্পট 2 "|" সেট করুন।
নিক

12
আপনি পুরোপুরি কোনও পেছন ব্যবহার করে ইন্ডেন্টেশন এড়াতে পারবেন letletএকটি নতুন লাইন অনুসরণ করে কেবল একটি টাইপ করুন : let⏎। তারপরে fac 0 = 1⏎। তারপরে fac n = n * fac (n-1)⏎ ⏎ এবং আপনি শেষ করেছেন!
আইসল্যান্ড_জ্যাক

62

ড্যান সঠিক, তবে :{এবং :}প্রত্যেককে অবশ্যই তাদের নিজস্ব লাইনে উপস্থিত থাকতে হবে:

> :{ 
> let foo a b = a +
>           b
> :}
> :t foo
foo :: (Num a) => a -> a -> a

এটি বিন্যাসের নিয়মের সাথেও ইন্টারঅ্যাক্ট করে, তাই ড-নোটেশন ব্যবহার করার সময় ব্রেস এবং আধা-কলোনগুলি স্পষ্টভাবে ব্যবহার করা সহজ হতে পারে। উদাহরণস্বরূপ, এই সংজ্ঞা ব্যর্থ:

> :{
| let prRev = do
|   inp <- getLine
|   putStrLn $ reverse inp
| :}
<interactive>:1:18:
    The last statement in a 'do' construct must be an expression

ব্রেস এবং আধা-কলোন যুক্ত করা হয় তবে এটি কাজ করে:

> :{
| let prRev = do {
|   inp <- getLine;
|   putStrLn $ reverse inp;
| }
| :}
> :t prRev
prRev :: IO ()

এটি কেবল তখনই আসবে যখন কোনও ফাইল থেকে সংজ্ঞাগুলি আটকানো হবে, যেখানে ইনডেন্টেশন পরিবর্তন হতে পারে।


কমপক্ষে .6..6.৩ সংস্করণে '=' (পরবর্তী লাইনে থাকা সংজ্ঞা সহ) শেষ হওয়া কোনও লাইন থাকলে এটি কাজ করে না।
অ্যাডামসি

1
সম্ভবত এটি ব্যর্থ হয়, কারণ লেটের দ্বিতীয় এবং তৃতীয় লাইনটি যথেষ্ট ইন্টেন্টেড হয় না ...? (আরও দুটি স্পেস।)
Evi1M4chine


7

আপনি যদি কেবল :{এবং এর জন্য জিএইচসি আপগ্রেড করতে না চান তবে আপনাকে :}এটি সমস্ত একটি লাইনে লিখতে হবে:

> let abs' n | n >= 0 = n | otherwise = -n

আমি হাস্কেলের কোনও একক সংজ্ঞা সম্পর্কে অবগত নই যা একাধিক লাইনে লেখা উচিত । উপরেরগুলি সত্যই জিএইচসিতে কাজ করে:

> :t abs'
abs' :: (Num a, Ord a) => a -> a

doব্লকগুলির মতো অন্যান্য এক্সপ্রেশনগুলির জন্য আপনাকে কোঁকড়ানো ধনুর্বন্ধনী এবং সেমিকোলনগুলির সাথে অ-লেআউট বাক্য গঠন ব্যবহার করতে হবে (ইওউ)।


0

আমি ম্যাকোস ক্যাটালিনা 10.15.2 তে জিএইচসিআই, সংস্করণ 8.2.1 ব্যবহার করছি। নীচে আমি উভয় ফাংশন প্রকারের ঘোষণা এবং গার্ডগুলি একসাথে রেখেছি। নোট করুন যে বামদিকে উল্লম্ব বারগুলি জিএইচসিআই একাধিক লাইনের জন্য।

λ: let abs' :: (Num a, Ord a) => a -> a
 |     abs' n | n >= 0 = n | otherwise = -n
 | 
λ: abs' 7
7
λ: abs' (-7)
7

1
যদি আপনি ব্যবহার করেন :{এবং আপনার ধরণের ঘোষণার আগে :}আপনাকে নির্দিষ্ট let করার দরকার নেই , যার অর্থ আপনার দ্বিতীয় এবং পরবর্তী লাইনগুলি ইনডেন্ট করার দরকার নেই।
ডেভিডা

আপনাকে অনেক ধন্যবাদ ডেভিডা। ঠিক এটিই আমি খুঁজছিলাম কিন্তু খুঁজে পাইনি।
গোল্ডেন থাম্ব

0

দেখে মনে হচ্ছে একসাথে উভয় লাইন আটকে দেওয়া বা প্রতিটি নতুন লাইনের জন্য কন্ট্রোল-এন্টার ব্যবহার করে এগুলি সবই একসাথে রাখে, কমপক্ষে https://repl.it/languages/haskell এ । দ্বিতীয় লাইনের শুরুতে আপনি দুটি বিন্দু দেখতে পাবেন। অথবা এটি একটি ফাইলে রাখুন এবং: ফাইলটি লোড করুন (: l প্রধান)। কীভাবে নেতিবাচক সংখ্যা নিয়ে অ্যাবস কাজ করে না? ওহ আপনাকে সংখ্যাটির চারপাশে প্রথম বন্ধনী স্থাপন করতে হবে।

   let abs n | n >= 0 = n 
..           | otherwise = -n
   abs (-1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.