簡體   English   中英

錯誤:沒有由文字“1”引起的 (Num Char) 實例

[英]ERROR: no instance for (Num Char) arising from the literal `1'

insert_at將元素e插入到特定位置n的列表xs

如果n小於 0,則test Left

如果n大於xs的長度或類型e與列表xs中元素的類型不匹配,則test2將得到Left 否則將Right xs傳遞給下一個。

import Data.Typeable

insert_at :: a -> [a] -> Int -> [a]
insert_at e xs n = a++(e:b) where
    t = splitAt n xs
    a = fst t
    b = snd t 
test :: (Ord a, Num a) => b -> a -> Either [Char] b
test xs n = if n < 0 then Left "n<0" else Right xs

test2 :: (Typeable a1, Typeable a2) =>
           a1 -> [a2] -> Int -> Either [Char] [a2]
test2 e xs n 
        | n> ( length xs )= Left "n> $ length xs "
        | (typeOf e) /= (typeOf (head xs) ) = Left "(typeOf e) /= (typeOf (head xs) ) "
        |otherwise = Right xs

sf :: Typeable a => a -> [a] -> Int -> Either [Char] [a]
sf e xs n = test xs n >>test2 e xs n >> Right (insert_at e xs n)

所有其他錯誤都得到了正確處理,期待這個。

* No instance for (Num Char) arising from the literal `1'
    * In the expression: 1
      In the second argument of `sf', namely `[1, 2, 3, 4, ....]'
      In the expression: sf 'a' [1, 2, 3, 4, ....] 3

錯誤消息表明您正在嘗試評估表達式sf 'a' [1, 2, 3, 4, ....] 3 由於您的問題中未顯示此表達式,因此我假設您在 GHCi 中使用它來測試您的代碼,對嗎?

sf的類型簽名表示第一個參數的類型a ,第二個參數的類型為[a] ,這是一個列表,其元素與第一個參數的類型相同。

所以編譯器看到第一個參數是'a' 那是一個字符,輸入Char

“知道了,” - 編譯器想, - “現在我知道aChar 。現在我知道第二個參數必須具有[Char]類型 - 即Char的列表”。

是的,第二個參數確實是一個列表,但是等等,列表的第一個元素不是字符,而是數字1 那不計算!

幸運的是,數字文字在 Haskell 中是特殊的。 數字文字不僅是Int類型,甚至是Integer類型,不! 數字可以是任何類型,只要該類型具有 class Num的實例即可。

因此,由於編譯器已經知道該列表的元素必須是Char類型,但它看到的是數字文字,因此它得出結論,它現在必須為Char類型找到 class Num的實例。

但是沒有這樣的實例:所以編譯器正確地抱怨:“沒有實例Num Char


為了解決這個問題,我需要更好地理解你實際上想要做什么。

您是否打算將整個 function 用於處理數字? 那么第一個參數必須是數字,而不是字符。

還是您打算將其用於角色? 那么第二個參數必須是字符列表,而不是數字。

或者您是否打算將前兩個參數完全不屬於同一類型? 然后您必須更改sf的類型簽名以表明這一點。

sf期望一個值和一個列表作為其前兩個 arguments。 列表的元素必須與第一個參數具有相同的類型。 這是的意思

sf :: a -> [a] -> ...

當您編寫sf 'a' [1]時,這意味着1'a'必須具有相同的類型。 所以類型檢查器尋找一種將1解釋為Char的方法; 它失敗了,因為這是不可能的。 一些修復可能包括:

sf 'a' "1234" 3
sf 'a' [toEnum 1, toEnum 2, toEnum 3, toEnum 4] 3
sf (fromEnum 'a') [1, 2, 3, 4] 3

暫無
暫無

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

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