การเรียกใช้ function (function application) ใน Haskell ที่พบได้ใน code ทั่วไป มีอย่างน้อย 3 แบบ

1. f x

(space) เป็น function application operator ของ Haskell, f1 a เทียบเท่ากับ f1(a) ในภาษาอื่นเนื่องจาก function เป็นหน่วยพื้นฐานใน Hasell ไวยากรณ์การใช้งาน function ที่กระชับช่วยให้ code มีสิ่งรบกวนน้อย

2. f $ x

($) :: (a -> b) -> a -> b เป็น binary operator (function ที่มี 2 argument) ที่นิยมใช้เพื่อลดจำนวนวงเล็บ

ตัวอย่าง: code ข้างล่างนี้ให้ผลลัพท์แบบเดียวกัน

f1 (f2 (f3 (f4 a)))f1 $ f2 $ f3 $ f4 a(f1 . f2 . f3 . f4) af1 . f2 . f3 . f4 $ a

3. x # f

(#) :: a -> (a -> b) -> b หรือ ($) กลับด้าน (flip ($)) เป็นไวยากรณ์ที่คล้ายกับของภาษา object-oriented ตัวอย่างการใช้งานพบได้ใน library diagrams สังเกตว่าลำดับ composition กลับด้านกับ (.)

a # f4 # f3 # f2 # f1

หากต้องการแค่ใช้ code ล่าสุดโดยไม่สนใจประวัติการแก้ไขก่อนหน้านั้น หรือต้องการใช้กับ Continuous Integration (CI) เราสามาถเลือกความลึกของประวัิตได้ ด้วย --depth n

ตัวอย่าง: ความลึกเท่ากับ 1 จะได้ commit ล่าสุดเพียง commit เดียว ด้วยขนาด 14MiB

$ git clone --depth 1 https://github.com/NixOS/nixpkgs
Cloning into 'nixpkgs'...
remote: Counting objects: 20622, done.
remote: Compressing objects: 100% (14606/14606), done.
remote: Total 20622 (delta 592), reused 14395 (delta 339), pack-reused 0
Receiving objects: 100% (20622/20622), 14.38 MiB | 152.00 KiB/s, done.
Resolving deltas: 100% (592/592), done.
$ git log --oneline
87b215d5 (grafted, HEAD -> master, origin/master, origin/HEAD) android-studio-preview: 3.0.0.7 -> 3.0.0.8

เทียบกับ full clone: ได้ประวัติตั้งแต่เริ่ม ด้วยขนาด 513Mib

$ git clone https://github.com/NixOS/nixpkgs
Cloning into 'nixpkgs'...
remote: Counting objects: 959262, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 959262 (delta 5), reused 3 (delta 3), pack-reused 959244
Receiving objects: 100% (959262/959262), 513.09 MiB | 35.00 KiB/s, done.
Resolving deltas: 100% (641363/641363), done.

Originally published at wizzup.github.io


Posted on July 29, 2017

There are many ways to use GHC in nix-shell

  • System’s default GHC
$ nix-shell -p ghc
  • System’s default GHC with additional libraries
$ nix-shell -p 'haskellPackages.ghcWithPackages (self: with self; [ random ])' 
  • Specific version with libraries
$ nix-shell -p 'haskell.packages.ghc7103.ghcWithPackages (self: with self; [ random ])'
  • with shell.nix

Originally published with more details at wizzup.github.io.

About

Wisut Hantanong

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store