我每天都在學習 Haskell。此時,我想捕獲自定義資料的大小以進一步處理它。說我有:
data LetterAlphabet = L1 | L2 | L3 | L4 deriving (Show,Enum,Bounded)
fun :: (Bounded a, Enum a) => a -> Int
fun a = 1 fromEnum (maxBound :: LetterAlphabet)
它有效,但我必須明確指出資料型別。我嘗試使用 (maxBound :: typeof a) 和類似方法,但沒有成功。
uj5u.com熱心網友回復:
您可以使用asTypeOf :: a -> a -> awhich 回傳第一個專案但強制該??專案與第二個引數具有相同型別的技巧,因此:
fun :: (Bounded a, Enum a) => a -> Int
fun a = 1 fromEnum (asTypeOf maxBound a)
但更優雅的方式是使用TypeApplications擴展:
{-# LANGUAGE AllowAmbiguousTypes, ScopedTypeVariables, TypeApplications #-}
fun :: forall a . (Bounded a, Enum a) => Int
fun = 1 fromEnum (maxBound @a)
然后這可以用作fun @LetterAlphabet)。因此,我們只指定型別,不傳遞該型別的變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445373.html
標籤:哈斯克尔
