我有一个有效的程序。但是,我不确定它为什么要编译。
这是我的主要功能
module Main where
import System.Environment
import Cover5
main :: IO ()
main = do
args <- getArgs
let numGames = if null args then 13 else read $ head args
putStrLn $ "Making picks for " ++ show numGames ++ " games."
print $ run numGames
其中函数run
具有签名run :: Int -> RVar [(Int, Char)]
。
令人困惑的是Show
没有RVar [(Int,Char)]
的实例,所以我认为它不应该编译,但确实如此(请参阅Travis-CI build及其相关来源{ {3}})。我可以用这个命令强制警告:
cabal build --ghc-options="-fforce-recomp -fno-code"
Preprocessing executable 'cover5' for cover5-0.1.0.1...
[1 of 2] Compiling Cover5 ( src/Cover5.hs, nothing )
[2 of 2] Compiling Main ( src/Main.hs, nothing )
src/Main.hs:13:10: error:
• No instance for (Show (RVar [(Int, Char)]))
arising from a use of ‘print’
• In a stmt of a 'do' block: print $ run numGames
In the expression:
do { args <- getArgs;
let numGames = ...;
putStrLn $ "Making picks for " ++ show numGames ++ " games.";
print $ run numGames }
In an equation for ‘main’:
main
= do { args <- getArgs;
let numGames = ...;
putStrLn $ "Making picks for " ++ show numGames ++ " games.";
.... }
我想“修复”此问题并遵循问题commit of Main.hs
的指导所以我为StdRandom和runRVar添加了适当的导入并写下以下行
results <- runRVar (run numGames) StdRandom
putStrLn $ show results
但是我试图找到MonadRandom IO的实例用于我的使用:
src/Main.hs:13:21: error:
• No instance for (MonadRandom IO) arising from a use of ‘runRVar’
• In a stmt of a 'do' block:
results <- runRVar (run numGames) StdRandom
In the expression:
do { args <- getArgs;
let numGames = ...;
putStrLn $ "Making picks for " ++ show numGames ++ " games.";
results <- runRVar (run numGames) StdRandom;
.... }
In an equation for ‘main’:
main
= do { args <- getArgs;
let numGames = ...;
putStrLn $ "Making picks for " ++ show numGames ++ " games.";
.... }
所以有两个问题:
答案 0 :(得分:0)
答案由@leftaroundabout在评论中提供。在 import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
let manager = CLLocationManager()
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location: CLLocation = locations[0]
let myLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
//let span: MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
//let region: MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
//store myLocation in UserDefauls
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(myLocation.latitude, forKey: "latitude")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(myLocation.longitude, forKey: "longitude")
UserDefaults.standard.set(myLocation.latitude, forKey: "latitude")
UserDefaults.standard.set(myLocation.longitude, forKey: "longitude")
UserDefaults().synchronize()
//region wel of niet? nog even over hebben
//mapView.setRegion(region, animated: true)
self.mapView.showsUserLocation = true
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()
//maakt van CLLocationCoordinate een CLLocation
func converter(locatie: CLLocationCoordinate2D) -> CLLocation {
let latitude = locatie.latitude
let longitude = locatie.longitude
return CLLocation(latitude: latitude, longitude: longitude)
}
let myLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(UserDefaults.standard.value(forKey: "latitude") as! CLLocationDegrees, UserDefaults.standard.value(forKey: "longitude") as! CLLocationDegrees)
//let myLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.value(forKey: "latitude") as! CLLocationDegrees, UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.value(forKey: "longitude") as! CLLocationDegrees)
// geeft zin met afstand van locatie1 tot myLocation
func afstandPuntTotUser(locatie1: CLLocationCoordinate2D) -> String {
let cllocatie1 = converter(locatie: locatie1)
let myLocation = converter(locatie: myLocation)
let afstand = cllocatie1.distance(from: myLocation)
let afgerondeafstand = afstand - afstand.truncatingRemainder(dividingBy: 1.0) //zorgt voor 1 kommagetal
if afstand < 1000.0 {
return "De afstand tot de bak is \(afgerondeafstand) meter"
}
else {
return "De afstand tot de bak is \(afgerondeafstand / 1000 - (afgerondeafstand / 1000).truncatingRemainder(dividingBy: 0.1)) kilometer"
}
}
//geeft puur afstand van locatie1 tot myLocation
func distanceForWidget(locatie1: CLLocationCoordinate2D) -> String {
let cllocatie1 = converter(locatie: locatie1)
let myLocation = converter(locatie: myLocation)
let afstand = cllocatie1.distance(from: myLocation)
let meters = afstand as Double - afstand.truncatingRemainder(dividingBy: 1.0) as Double
let kilometers = afstand / 1000 - (afstand / 1000).truncatingRemainder(dividingBy: 0.1)
if afstand < 1000.0 {
return "\(meters) m"
}
else {
return "\(kilometers) km"
}
}
//voegt snel een afvalbakpin toe
func addAfvalbak(pinLocatie: CLLocationCoordinate2D) -> MKAnnotation {
return purePin(title: "Afvalbak", subtitle: afstandPuntTotUser(locatie1: pinLocatie), coordinate: pinLocatie) as MKAnnotation
}
//voegt sel een glasbakpin toe
func addGlasbak(pinLocatie:CLLocationCoordinate2D) -> MKAnnotation {
return purePin(title: "Glasbak", subtitle: afstandPuntTotUser(locatie1: pinLocatie), coordinate: pinLocatie)
}
//voegt snel een blikvangerpin toe
func addBlikvanger(pinLocatie:CLLocationCoordinate2D) -> MKAnnotation {
return purePin(title: "Blikvanger", subtitle: afstandPuntTotUser(locatie1: pinLocatie), coordinate: pinLocatie)
}
//voegt snel een volledige afvalbak pin + afstand toe
func addFullAfvalbak(pinlocatie: CLLocationCoordinate2D) -> fullPin {
return fullPin(title: "Afvalbak", subtitle: afstandPuntTotUser(locatie1: pinlocatie), coordinate: pinlocatie)
}
//voegt snel een volledige glasbak pin + afstand toe
func addFullGlasbak(pinlocatie: CLLocationCoordinate2D) -> fullPin {
return fullPin(title: "Glasbak", subtitle: afstandPuntTotUser(locatie1: pinlocatie), coordinate: pinlocatie)
}
//voegt snel een volledige blikvanger pin + afstand toe
func addFullBlikvanger(pinlocatie: CLLocationCoordinate2D) -> fullPin {
return fullPin(title: "Blikvanger", subtitle: afstandPuntTotUser(locatie1: pinlocatie), coordinate: pinlocatie)
}
//array met alle afvalbaklocaties
let afvalbakLocaties: [CLLocationCoordinate2D] = [jacobbotkeweg1, jacobbotkeweg2, jacobbotkeweg3, jacobbotkeweg4, jacobbotkeweg5, jacobbotkeweg6, jacobbotkeweg7, aldlansdyk1, aldlansdyk2, aldlansdyk3, weideflora1, weideflora2, hempensweg1, hempensweg2, hempensweg3, hempensweg4, hempenserweg1, hempenserweg2, hempenserweg3, legedyk1, verlengdeschrans1, oostergoweg1, henridunantweg1, henridunantweg2, henridunantweg3, henridunantweg4, henridunantweg5, henridunantweg6, henridunantweg7, abbingapark1, abbingapark2, tijnjedyk1, tijnjedyk2, tijnjedyk3, tijnjedyk4, ipebrouwerssteeg1, nieuwestad1, nieuwestad2, nieuwestad3, nieuwestad4, nieuwestad5, nieuwestad6, nieuwestad7, nieuwestad8, nieuwestad9, nieuwestad10, nieuwestad11, nieuwestad12]
//array met alle glasbaklocaties
let glasbakLocaties: [CLLocationCoordinate2D] = [timothee1]
//array met alle blikvangerlocaties
let blikvangerLocaties: [CLLocationCoordinate2D] = [bitgummerdyk1]
//slaat alle locaties op voor widget
//UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(afvalbakLocaties, forKey: "afvalbakLocaties")
//UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(glasbakLocaties, forKey: "glasbakLocaties")
//UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(blikvangerLocaties, forKey: "blikvangerLocaties")
//array met alle pinnen die worden toegevoegd
var allePinnen: [MKAnnotation] = []
//voegt alle afvalbakken toe aan allePinnen
for item in afvalbakLocaties {
allePinnen.append(addAfvalbak(pinLocatie: item))
}
//voegt alle glasbakken toe aan allePinnen
for item in glasbakLocaties {
allePinnen.append(addGlasbak(pinLocatie: item))
}
//voegt alle blikvangers toe aan allePinnen
for item in blikvangerLocaties {
allePinnen.append(addBlikvanger(pinLocatie: item))
}
//voegt alle pinnen toe aan de kaart
mapView.addAnnotations(allePinnen)
var fullPinnen:[fullPin] = []
//voegt alle afvalbakken toe aan fullPinnen
for item in afvalbakLocaties {
fullPinnen.append(addFullAfvalbak(pinlocatie: item))
}
//voegt alle glasbakken toe aan fullPinnen
for item in glasbakLocaties {
fullPinnen.append(addFullGlasbak(pinlocatie: item))
}
//voegt alle blikvangers toe aan fullPinnen
for item in blikvangerLocaties {
fullPinnen.append(addFullBlikvanger(pinlocatie: item))
}
//sorteert de bakken in fullPinnen op afstand
fullPinnen.sort {$0.afstand < $1.afstand}
//slaat de 3 dichtsbijzijnde afvalbakken op
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")!.set(fullPinnen[0].afstand, forKey: "closestpin1afstand")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(fullPinnen[0].title, forKey: "closestpin1naam")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")!.set(fullPinnen[1].afstand, forKey: "closestpin2afstand")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(fullPinnen[1].title, forKey: "closestpin2naam")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")!.set(fullPinnen[2].afstand, forKey: "closestpin3afstand")
UserDefaults(suiteName: "group.Afvalbakfinder.Jordadema.userLocation")?.set(fullPinnen[2].title, forKey: "closestpin3naam")
UserDefaults().synchronize()
向Random
新用户发送答案,以防其有用
第一个问题
大约3年前我写过原始程序。我不知道如何从RVar
打印结果。我选择使用Data.Random.Show.Unsafe
。显然,这个模块为RVar a
提供了一个Show的实例。我不记得了。
此外,我隐含地从Cover5模块中导出所有内容,因此上面代码的主模块正在导入该实例。
这就是print
正在发挥作用的原因。
第二个问题
Data.Random
中提供了实例,我没有导入。
我之所以遇到错误却认为他们是警告是因为我一次更改了2件(实际上超过2件):