我有這個
data Pair = P Int Double deriving Show
myP1 = P 1 2.0
getPairVal (P i d) = (i,d)
getPairVal' (P i d) = (,) i d
哪個作業,都產生(1,2.0). 有什么辦法可以直接(,) myP1作業嗎?但是,這將需要某種“演員”,我猜。
data Pair2 = P2 (Int, Double) deriving Show
是一個“更方便”的元組版本
myP21 = (5,5.0)
那么Pair有或沒有元組型別定義的產品型別的優勢是什么?我似乎記得 SML 有更密切的關系,即每個產品型別都是一個元組型別。在數學中,任何“產品”都會產生一個元組。Haskell 顯然不是。
uj5u.com熱心網友回復:
為什么不應該直接 (,) myP1 作業?
嗯,(,)是一個函式,它接受兩個值并從中生成一個元組。P 1 2.0是不兩個值:它是型別的單個值Pair,其中包含兩個欄位。But(,) (P 1 2.0)是一個型別良好的運算式:它已經構建了一個元組的左半部分,右半部分還需要一個引數。所以:
let mkTuple = (,) (P 1 2.0)
in mkTuple "hello"
評估為
(P 1 2.0, "hello")
為什么我們應該定義型別Pair而不是使用元組?user202729在評論中鏈接到Haskell:代數資料與元組,這是對該問題的一個很好的回答。
但是您可以使用的另一種方法是定義一個newtype包裝元組,以便您擁有不同的命名型別,但與元組具有相同的運行時表示:
newtype Pair2 = P2 (Int, Double) deriving Show
如果您使用newtype代替data,您會得到一個簡單的轉換函式,您可能會選擇將其視為強制轉換:Data.Coerce.coerce。有了這個,你可以寫
myP21 = coerce (5, 5.0)
反之亦然。這種方法主要用于現有型別的新型別類實體。如果您需要一個由兩個值組成的新域型別,我仍然鼓勵您默認使用data具有兩個欄位的型別,除非有令人信服的理由不這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/393117.html
標籤:哈斯克尔
