ابتدای محتوای صفحه
۲۶ - ۱۴تمرینهای فصل
List
ِ اکید
با این تایپِ List
یه کم بازی کنین و با اونی که بالاتر به کمک الگوی بنگ نوشتیم مقایسه کنین:
{-# LANGUAGE BangPatterns #-}
module StrictTest where
data List a =
Nil |
Const a (List a)
deriving (Show)
take' n _ | n <= 0 = Nil
take' _ Nil = Nil
take' n (Cons x !xs) =
(Cons x (take' (n-1) xs))
map' _ Nil = Nil
map' f (Cons x xs) =
(Cons (f x) (map' f xs))
repeat' x = xs where xs = (Cons x xs)
main = do
print $ take' 10 $ map' (+1) (repeat' 1)
:sprint
چی میگه؟
یک یا چندتا تعریف میدیم، شما (قبل از تست کردن) بگین خروجیِ :sprint
چی میشه.
۱.
let x = 1
۲.
let x = ['1']
۳.
let x = [1]
۴.
let x = 1 :: Int
۵.
let f = \x -> x
let x = f 1
۶.
let f :: Int -> Int; f = \x -> x
let x = f 1
آیا چاپِ این بیانیه منجر به تهی میشه؟
۱.
snd (undefined, 1)
۲.
let x = undefined
let y = x `seq` 1 in snd (x, y)
۳.
length $ [1..5] ++ undefined
۴.
length $ [1..5] ++ [undefined]
۵.
const 1 undefined
۶.
const 1 (undefined `seq` 1)
۷.
const undefined 1
بیانیه رو تهی کنین
فقط با استفاده از الگوی بنگ یا seq
، کاری کنین کدِ زیر در اجرا تهی بشه.
۱.
x = undefined
y = "blah"
main = do
print (snd (x, y))