Int和Num类型的haskell

Rus*_*ssj 1 variables haskell types function

我有下面的代码来取args来设置一些偏移时间.

setOffsetTime :: (Ord a, Num b)=>[a] -> b
setOffsetTime [] = 200
setOffsetTime (x:xs) = read x::Int
Run Code Online (Sandbox Code Playgroud)

但编译器说" 无法推断(b~Int)来自上下文(Ord a,Num b)的setOffsetTime ::(Ord a,Num b)=> [a] - > b的类型签名约束

另外,如果我想将float作为默认值,我发现我无法使用200.0.编译器说"无法推断(小数b)来自文字"200.0"

任何人都可以向我展示一些代码作为一个函数(不在前奏中),它使用arg存储一些变量,以便我可以在其他函数中使用吗?我可以在main = do中做到这一点,但希望用一个优雅的函数来实现这一点.Hasekll有没有全球不变的东西?我用Google搜索,但似乎没有.

我想用Haskell替换我的一些python脚本,虽然这并不容易.

Ben*_*Ben 6

我认为这种类型的签名并不代表你的想法:

setOffsetTime :: (Ord a, Num b)=>[a] -> b

什么,说是:"如果你给我类型的值[a],对于任何类型的a ,你选择的是成员Ord类型的类,我会给你类型的值b,对于任何类型b的是选择是的成员Num类型类".该来电者获得选择特别的类型ab所使用的每一次setOffsetTime被调用.

因此,尝试返回类型Int(或Float,或任何特定类型)的值是没有意义的.Int确实是类类的成员Num,但它不是类类的任何成员Num.根据该类型签名,我应该能够创建一个Num你以前从未见过的全新实例,setOffsetTime从你的模块导入,并调用它来获得我的新类型的值.

要想出一个可接受的返回值,您只能使用同样返回任意值的函数Num.您不能使用特定具体类型的任何功能.

存在类型本质上是一种机制,允许被调用者为类型变量选择值(然后调用者必须被写入工作而不管该类型是什么),但这并不是你想要进入的东西.还在学习.