第二十一章:語言擴充套件和程式標註
之後的章節將介紹高階型別類和實際應用中的實踐。
1.語言擴充套件 Language Extension
開啟某個語言擴充套件
+原始碼頂部加入以下程式碼,它在該檔案內生效
{-# LANGUAGE Extension #-}
+在GHCi中使用 :set -XExtension,它在該會話內有效 +cabal配置中使用extension配置項,指定整個專案所有程式碼都開啟的語言擴充套件
常用的語言擴充套件
+TupleSections:可以把 表示式 (1,,3,)解析成\x y -> (1,x,3,y)
+LamdaCase:簡化 \ x -> case x of 成 \case
+MultiWayIf
+BinaryLiterals:進位制數字書寫 0b/0B 2進位制,0x/0X 16進位制, 0o/0O 8進位制
+BangPattern:用來方便書寫需要對引數進行嚴格求值的函式,如: someFun (!x, !y) = ..., 可以避免不必要的任務盒累積
+Record puns:對使用記錄語法的資料作模式匹配時使用,NameFieldPuns
+RecordWildCards:批量引入資料項的繫結
2.嚴格求值資料項
在Haskell中,可以在data宣告中使用!來標註某些資料項是嚴格求值的(總會被求值到弱狀態)
data vec2 = vec2 !Double !Double
3.惰性模式
與上面的!對應,~起到相反的作用,稱為惰性模式 Lazy pattern, 也叫強制匹配模式 irrefutable pattern
f :: (a, b) -> Int
f ~(x, y) = x
--f (1, 2) == 1
--f() 執行報錯
4.程式標註 pragma
語言擴充套件的語法 {-# ... #-} 實際上是程式標註的一種形式,下面是一項常用的程式標註
展開盒裝資料 UNPACK,如上面的vec2,我們可以進一步把資料中需要求值的資料項展開到資料的負載中
data vec3 = vec3 {-# UNPACK #-} !Double {-# UNPACK #-} !Double {-# UNPACK #-} !Double
好處:資料變得緊湊,更節省空間,資料訪問變快;
缺點:資料共享變得困難,無法通過指標指向任務盒的方式建立惰性計算的資料
內聯 INLINE
用來控制程式編譯過程中函式內聯的發生,請盡力內聯該函式
pred :: Int -> Bool {-# INLINE pred #-}
INLINABLE / NONLINE
INLINABLE 標註該函式是可以內聯的;NONLINE 請永遠不要內聯該函式,往往配合一些unsafexxx函式使用
5.編譯選項
在使用GHC編譯選項時,可以通過命令列給GHC傳遞一些選項來控制編譯過程
ghc -fwarn-incomplete-patterns Main.hs
上面的-fwarn-incomplete-patterns告訴GHC對不完全的模式匹配輸出警告
下面是一些常用的引數
- -O filename:設定編譯目標檔案的名稱
- -prof : 開啟執行分析
- -0x/0 :x是0,1,2,代表GHC的優化等級 optimization level,預設是0不優化
- -vx/v:資訊輸出的等級,從0到4
- -Wall:開啟全部的警告
- -stastic:告訴連結器使用靜態函式庫連線最終的程式
- -threaded:多執行緒執行時,用來控制編譯的程式在多核硬體上的執行
在cable配置裡,我們可以針對美國executable/libaray條目控制編譯過程的選項
6.執行分析 -prof
- -fprof-auto
- +RTS -p分析時間消耗
- +RTS -h分析記憶體開銷
- hp2ps (-c) *.hp 把分析檔案轉換為 .ps檔案
相關文章
- XAML 屬性元素,標記擴充套件和註釋套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Cilium 1.3:支援Envoy、Cassandra和Memcached的Go語言擴充套件Go套件
- C++對C語言的擴充套件(1)--引用C++C語言套件
- [WPF]標記擴充套件(Markup Extension)套件
- c 語言除錯方法(除錯 PHP 底層、擴充套件)除錯PHP套件
- chrome擴充套件程式開發Chrome套件
- 編寫可擴充套件程式套件
- Wise Menu for MacFinder擴充套件程式Mac套件
- 乾貨丨如何水平擴充套件和垂直擴充套件DolphinDB叢集?套件
- Cython,一個簡化 Python 編寫 C 擴充套件的語言Python套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- BeanDefinition註冊流程、spring 擴充套件點一(NamespaceHandler)BeanSpring套件namespace
- Laravel 遷移增加表備註擴充套件方法Laravel套件
- laradock 安裝擴充套件程式 pcntl套件
- Bundler和Minifier Visual Studio擴充套件Nifi套件
- 安裝Swoole框架和擴充套件框架套件
- 擴充套件工具套件
- Sanic 擴充套件套件
- Mybatis擴充套件MyBatis套件
- SpringMVC 擴充套件SpringMVC套件
- ORACLE 擴充套件Oracle套件
- vue3 setup語法糖 擴充套件Vue套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- JMeter 擴充套件開發:擴充套件 TCP 取樣器JMeter套件TCP
- Apollo 釋出 GraphQL 平臺和 VS 程式碼擴充套件套件
- 基於shiro的自定義註解的擴充套件套件
- 這個Dubbo註冊中心擴充套件,有點意思!套件
- Noir – Dark Mode for Safari (Safari 擴充套件程式)套件
- Safari 擴充套件程式:Noir – Dark Mode for Safari套件
- 第一章 程式設計和C語言----案例程式設計C語言
- 聊聊Spring擴充套件點BeanPostProcessor和BeanFactoryPostProcessorSpring套件Bean
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- ASP.NET Core擴充套件庫之Http通用擴充套件ASP.NET套件HTTP
- iOS 通知擴充套件iOS套件
- swift擴充套件ExtensionsSwift套件
- 擴充套件BSGS/exBSGS套件
- Json擴充套件方法JSON套件
- 分類擴充套件套件