如何打印RVar采样结果

时间:2017-01-15 15:32:53

标签: haskell

我有一个有效的程序。但是,我不确定它为什么要编译。

这是我的主要功能

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.";
                   .... }

所以有两个问题:

  1. 为什么原始版本会编译并运行?
  2. 您可以建议我删除警告并将其“正确”写下来吗?

1 个答案:

答案 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件):

  1. 我限制了从Cover5模块导出的内容,因此不安全 Show的实例不再导出
  2. 我使用一些参数运行构建,我认为这些参数只会显示比传统构建更多的警告。