簡體   English   中英

在Haskell中使用類型別名的正確方法是什么

[英]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

這將允許您繼續使用真正獨特的數據類型,而不是訴諸類型別名,它不會引入任何新類型,並且允許完全可互換地使用PuzzleMatrix Char而不增加類型安全性(也不具有表現力)。

此外,Jeffrey的正確之處在於newtype更類似於data不是type - newtype提供了對data一些性能優化,但是更受限制並且稍微影響了程序評估語義。 您最好閱讀有關在Haskell中定義類型和類型別名的各種方法。

在您的情況下,您也可以在不改變程序行為的情況下替換newtype data ; 程序的其余部分應繼續以相同的方式工作。

另請參閱: Haskell類型與newtype相關的類型安全性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM