[英]What's the right way to use type aliases in Haskell
我是Haskell的初學者。 在嘗試解決關於hackerrank的一些練習練習時,我偶然發現了一個錯誤,這讓我想知道“正確的方式”(tm)。
我試圖做的是這樣的:
import Data.Matrix
newtype Puzzle = Matrix Char
complete :: Puzzle -> Bool
complete p = '-' `elem` (toList p)
[... more functions using 'Matrix Char']
什么給了我
Couldn't match expected type ‘Matrix Char’
with actual type ‘Puzzle’
In the first argument of ‘toList’, namely ‘p’
In the second argument of ‘elem’, namely ‘(toList p)’
顯而易見的解決方案當然只是使用Matrix Char
而不是Puzzle
。 但我覺得這不是一個優雅的解決方案。 抽象為更具體的類型感覺是正確的方式...
使用type
而不是newtype
。 前者創建一個類型別名,后者是一個新類型聲明。 具體地說newtype
是種特殊情況下data
,其中,所述新類型表示一個“包裝”在現有的類型(這是可以由編譯器進行優化的情況下)。
我認為比Jeffrey的答案提供的更好的解決方案,至少在比玩具游戲更具實質性的代碼基礎的情況下,是繼續使用newtype
但是將代碼更改為:
import Data.Matrix
newtype Puzzle = Puzzle (Matrix Char)
complete :: Puzzle -> Bool
complete (Puzzle matrix) = '-' `elem` toList matrix
這將允許您繼續使用真正獨特的數據類型,而不是訴諸類型別名,它不會引入任何新類型,並且允許完全可互換地使用Puzzle
和Matrix Char
而不增加類型安全性(也不具有表現力)。
此外,Jeffrey的正確之處在於newtype
更類似於data
不是type
- newtype
提供了對data
一些性能優化,但是更受限制並且稍微影響了程序評估語義。 您最好閱讀有關在Haskell中定義類型和類型別名的各種方法。
在您的情況下,您也可以在不改變程序行為的情況下替換newtype
data
; 程序的其余部分應繼續以相同的方式工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.