[英]Int and Num type of haskell
我有下面的代碼來使用args設置一些偏移時間。
setOffsetTime :: (Ord a, Num b)=>[a] -> b
setOffsetTime [] = 200
setOffsetTime (x:xs) = read x::Int
但是編譯器說“ 無法從由setOffsetTime ::(Ord a,Num b)=> [a]-> b的類型簽名所綁定的上下文(Ord a,Num b)中推導(b〜Int)
另外我發現如果我想將float用作默認值,則無法使用200.0。 編譯器說:“無法推斷出字面量“ 200.0”引起的(分數b)”
誰能向我展示一些作為函數的代碼(不在序言中),它需要一個arg來存儲一些變量,以便可以在其他函數中使用? 我可以在main = do中執行此操作,但希望使用一個優雅的函數來實現此操作。 Hasekll中是否有任何全局常量? 我用谷歌搜索,但似乎沒有。
我想用Haskell替換一些python腳本,盡管這並不容易。
我認為此類型簽名並不完全代表您的想法:
setOffsetTime :: (Ord a, Num b)=>[a] -> b
,說什么“如果你給我類型的值[a]
任何類型的a
選擇那就是成員Ord
類型的類,我會給你類型的值b
,對於任何類型b
您選擇是Num
類型類的成員”。 調用者可以選擇每次調用setOffsetTime
使用的特定類型a
和b
。
因此,嘗試返回Int
類型(或Float
或任何特定類型)的值沒有任何意義。 Int
的確是類型類的成員Num
,但它不是那種類的任何成員Num
。 根據該類型簽名,我應該能夠創建一個您從未見過的Num
全新實例,從您的模塊中導入setOffsetTime
並調用它以獲取我的新類型的值。
為了得出可接受的返回值,您只能使用同樣返回任意Num
函數。 您不能使用任何特定具體類型的功能。
存在類型本質上是一種機制,它允許被調用方選擇類型變量的值(然后無論該類型是什么,都必須編寫調用方才能使用),但這並不是您真正想進入的東西還在學習。
如果您確信函數的實現是正確的,即,它應該將其輸入列表中的第一個元素解釋為要返回的數字,如果沒有這樣的參數,則返回200
,那么您只需確保類型簽名與該實現匹配(目前尚不實現)。
為此,例如,您可以刪除類型簽名並要求ghci推斷類型:
$ ghci
GHCi, version 7.6.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :{
Prelude| let setOffsetTime [] = 200
Prelude| setOffsetTime (x : xs) = read x :: Int
Prelude| :}
Prelude> :t setOffsetTime
setOffsetTime :: [String] -> Int
Prelude> :q
Leaving GHCi.
$
的確,
setOffsetTime :: [String] -> Int
setOffsetTime [] = 200
setOffsetTime (x : xs) = read x :: Int
編譯良好。
如果要使用更通用的類型,則可以從第二種情況中刪除名稱:: Int
。 然后上述方法告訴您可以編寫
setOffsetTime :: (Num a, Read a) => [String] -> a
setOffsetTime [] = 200
setOffsetTime (x : xs) = read x
從您在問題中添加的注釋,我知道您希望函數返回浮點數。 在這種情況下,您可以編寫
setOffsetTime :: [String] -> Float
setOffsetTime [] = 200.0
setOffsetTime (x : xs) = read x
或更籠統地說:
setOffsetTime :: (Fractional a, Read a) => [String] -> a
setOffsetTime [] = 200.0
setOffsetTime (x : xs) = read x
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.