۲۶ - ۱۴تمرین‌های فصل

‏‎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))