簡體   English   中英

Haskell的Int和Num類型

[英]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使用的特定類型ab

因此,嘗試返回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.

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