我剛剛開始瞭解你對Haskell的好感,我在類型類中遇到了一些麻煩。我想創建一個可以使用任何數字類型的函數,並強制它成爲一個double類型。輸入num的雙倍簽名?
我首先想到的是定義
numToDouble :: Num -> Double
但我不認爲這工作,因爲Num
不是型,這是一個類型類(這在我看來是一組類型)。所以看着read
,顯示(Read a) => String -> a
。我正在讀的是「讀取一個字符串,並返回一個由用戶指定的類型a
」。所以我寫了下面
numToDouble :: (Num n) => n -> Double
numToDouble i = ((i) :: Double)
這在我看來就像「拿(輸入n的事情必須在Num
類型類,並將其轉換爲一個雙」,這似乎是合理的監守我可以做20::Double
這將產生以下輸出
Could not deduce (n ~ Double)
from the context (Num n)
bound by the type signature for numToDouble :: Num n => n -> Double
我不知道我在讀的基礎上能發現什麼,好像這事做多態?
編輯:
要清楚,我的問題是:爲什麼這不工作?
你可以寫這個函數,但它需要啓用'RankNTypes':'toDouble ::(forall n。num n => n) - > Double; toDouble i = i'。這可能不像你想要的那樣,你可以寫'toDouble 1'而不是'toDouble(1 :: Int)',因爲函數的參數必須是完全多態的 - 類型必須是「Num中的任何類型」 '' – user2407038