[英]How to use haskell types?
一個非常簡單的問題,我不能為我一生使用Google信息:(
我有以下幾種類型:
type NI = Int
type Age = Int
type Balance = Int
type Person = (NI, Age, Balance)
如果一個人的年齡超過65歲,如何創建一個返回true的函數? 我試過了:
retired :: Person -> Bool
retired p = p >= 65
它顯然不起作用,我意識到即使嘗試了它。 我對如此簡單的事情感到困惑。
由於Person
是一個元組,因此您應該像這樣對它進行模式匹配:
retired (_,age,_) = age >= 65
它應該工作
type X = Y
定義類型別名 。 在此示例中, X
定義為與Y
相同。 因此, retired :: Person -> Bool
與retired :: (Int, Int, Int) -> Bool
。
然后我們可以問一個問題:我們如何獲得一個人的年齡? 好吧, Person
與(Int, Int, Int)
,我們知道元組的第二個元素是人的年齡。 因此,一個等效的問題是:如何獲得三元組的第二個元素?
在Haskell中,這是通過解構元組來完成的,這與構造元組相反。 構造元組的一個示例是x = (1,2,3)
。 為了解構元組,我們使用類似的表示法,但反過來: (a,b,c) = x
。 這與(a,b,c) = (1,2,3)
相同,並且與三個賦值a = 1; b = 2; c = 3
a = 1; b = 2; c = 3
a = 1; b = 2; c = 3
。
Haskell允許您將此解構符號用於函數參數。 因此, retired p = e
可以寫成retired (ni, age, balance) = e
,回想起Person
是一個三元組。 現在很簡單, e
應該是age >= 65
。
為了進一步詳細說明, retired (ni, age, balance) = e
等於retired p = let (ni, age, balance) = p in e
。 知道這很有用,因為這樣功能應用程序會更清晰。 retired x
成為let (ni, age, balance) = x in [x/p]e
中的[x/p]e
,其中[x/p]e
表示“用x代替e中的 p ”。
另一種方法是使用記錄符號定義數據類型。
data Person = Person { ni :: Int, age :: Int, balance :: Int }
這定義了一個稱為Person
的新類型,並且與類型(Int, Int, Int)
組不同。 另外,它定義了三個投影函數ni :: Person -> Int
, age :: Person -> Int
和balance :: Person -> Int
。
現在,如果我們實現retired :: Person -> Bool
我們可以做到: retired p = age p >= 65
,或采用無點形式retired = (>= 65) . age
retired = (>= 65) . age
。
要重新連接第一種方法,還可以使用解構嗎? 絕對。 將Person構造為x = Person mnp
,因此類似地可以將其構造為Person abc = x
。 因此, retired
另一個定義是retired (Person nab) = a >= 65
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.