Haskell 不能';t匹配预期类型‘;IO()’;实际类型[地点]
试图运行一些haskell代码,但它没有运行。给我上面看到的错误Haskell 不能';t匹配预期类型‘;IO()’;实际类型[地点],haskell,Haskell,试图运行一些haskell代码,但它没有运行。给我上面看到的错误 type Name = String type Location = (Float,Float) type RainfallFigures = [Int] type Place = (Name,Location,RainfallFigures) testData::[Place] testData=[("London", (51.5, -0.1), [0, 0, 5, 8, 8, 0, 0]),("Cardiff", (51.5
type Name = String
type Location = (Float,Float)
type RainfallFigures = [Int]
type Place = (Name,Location,RainfallFigures)
testData::[Place]
testData=[("London", (51.5, -0.1), [0, 0, 5, 8, 8, 0, 0]),("Cardiff", (51.5 , -3.2),[12, 8, 15, 0, 0, 0, 2])]
rtnNames::[Place] -> [Place]
rtnNames x=x
demo :: Int -> IO ()
demo 1 = rtnNames testData
最后一行demo 1=rtnNames testData出现错误
我试图让rtnNames现在只返回测试数据本身作为第一个障碍问题是您的签名
demo :: Int -> IO ()
指示演示应返回类型为IO()
的IO操作。但是,您的实现返回rtnNames testData
。由于rtnNames
的实现只返回其参数,因此这相当于只返回testData
。但这是一个问题,因为testData
是[Place]
,而不是IO()
。也许你想打印名单?看起来是这样的:
demo 1 = print testData
我希望它会被编译
然而,您的代码存在一些更深层次的设计问题。您正在使用大量的type
s,这可能比newtype
s更好newtype
允许您扩展类型检查器,以确保特定的[Int]
实际上是一个RainfallFigures
,而不仅仅是任何旧的数字列表
您的
rtnNames
函数也很重要,因为它什么都不做。一个不做任何事情的函数没有本质上的错误,事实上它是非常有用的,这就是为什么它是开箱即用的<代码>id类型为a->a
rtnNames
只是id
的一种特殊化,但从您使用它的上下文来看,我怀疑它不是故意的。问题是您的签名
demo :: Int -> IO ()
指示演示应返回类型为IO()
的IO操作。但是,您的实现返回rtnNames testData
。由于rtnNames
的实现只返回其参数,因此这相当于只返回testData
。但这是一个问题,因为testData
是[Place]
,而不是IO()
。也许你想打印名单?看起来是这样的:
demo 1 = print testData
我希望它会被编译
然而,您的代码存在一些更深层次的设计问题。您正在使用大量的type
s,这可能比newtype
s更好newtype
允许您扩展类型检查器,以确保特定的[Int]
实际上是一个RainfallFigures
,而不仅仅是任何旧的数字列表
您的
rtnNames
函数也很重要,因为它什么都不做。一个不做任何事情的函数没有本质上的错误,事实上它是非常有用的,这就是为什么它是开箱即用的<代码>id类型为a->a
rtnNames
只是id
的一种专门化,但从您使用它的上下文来看,我怀疑它不是故意的。rtnNames什么都不做,因为我只是试图让我的程序通过实际运行的第一道障碍。但是谢谢你。我用print(rtnNames-testData)替换了rtnNames-testData,效果很好!当然,作为存根,那很好。仍然会鼓励您查看newtype
s。让编译器静态地强制执行数据的语义类型,而不仅仅是强制执行内部存储类型,这真是太棒了。rtnNames什么都不做,因为我只是试图让我的程序通过实际运行的第一道障碍。但是谢谢你。我用print(rtnNames-testData)替换了rtnNames-testData,效果很好!当然,作为存根,那很好。仍然会鼓励您查看newtype
s。让编译器静态地强制执行数据的语义类型,而不仅仅是强制执行内部存储类型,这真是太棒了。