我這樣做是作為模式匹配練習。
我想要一個可以在Num型別和List型別上作業的函式。例如:
double 20
double [1,2,3,4,5]
代碼一直有效
double [] = []
double (x : xs) = (2 * x) : (double xs)
main = do
let x = [1,2,3,4,5]
print (double x)
但是當我嘗試時:
double x = x x
double [] = []
double (x : xs) = (2 * x) : (double xs)
main = do
let x = [1,2,3,4,5]
print (double 20)
print (double x)
它給出了錯誤。
這里應該做什么?
uj5u.com熱心網友回復:
正如 chi 所說,最好有單獨的功能。我要補充一點,尤其是在你學習的時候,思考和撰寫函式的型別簽名是一個好習慣。
為了回答您的問題,您仍然可以這樣做。
您告訴 HaskellInteger和[Integer]資料型別“可以加倍”,然后定義如何為每種型別執行此操作。我知道這比你問的更先進:)
{-# LANGUAGE FlexibleInstances #-}
class CanDouble a where
double :: a -> a
instance CanDouble Integer where
double = (*2)
instance CanDouble [Integer] where
double = map (*2)
> double 5
10
> double [1,2,3]
[2,4,6]
uj5u.com熱心網友回復:
除了在 Haren 的回答中使用型別類Either Int [Int]之外,您還可以使用.
double :: Either Int [Int] -> Either Int [Int]
double (Left n) = Left $ n * 2
double (Right lst) = Right $ map (* 2) lst
ghci> double (Left 5)
Left 10
ghci> double (Right [1,2,3])
Right [2,4,6]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528507.html
標籤:哈斯克尔
