Haskell parse error with ghci with 'let' - parsing

I've been sitting around here for quite some time now and my problem just won't solve by googling, try and error. I've got the following code snippet:
data Prozess = Prozess { pid :: Int, arrival :: Int, computing :: Int } deriving (Show)
let idle = Prozess{pid=1, arrival=5, computing=10}
So I tried to compile it with ghci, but it's keep giving me a "parse error (possibly incorrect indentation or mismatched brackets)" at the "let idle ..."-line. Weird thing is, I tried compiling this using our Jupyter-Server and that seems to work nicely. Also, if I compile it without the "let"-line and input the -exact- same line afterwards via Terminal in *Main>, it's working fine too.
So what's wrong with ghci? Think I'm losing my mind over this.

Your let isn't in any function is it?
If you're just defining a global "constant", you just go:
idle :: Prozess
idle = Prozess{pid=1, arrival=5, computing=10}
Also, note that you don't need the record notation. You can swap that for:
idle = Prozess 1 5 10

Related

What is wrong with this Akka.NET code?

I spent some time searching for the Akka.NET F# API. Could not find it, even though there is good C# documentation. I found the code below, dated March 2017, which looks good, but unfortunately generates an exception when I try to run it.
Two questions:
1) What is wrong with the code below?
2) Is there online documentation for the Akka.Net F# API and if yes, where is it?
Observation: I tried several other F# Akka.NET snippets I found online and all of them generated exceptions.
The URL for the code is:
https://www.seventeencups.net/building-a-mud-with-f-sharp-and-akka-net-part-one/
And here is the code I tried to run:
open System
open Akka.Actor
open Akka.Configuration
open Akka.Remote
open Akka.FSharp
let system = System.create "system" (Configuration.defaultConfig())
type GreeterMsg =
| Hello of string
| Goodbye of string
let greeter = spawn system "greeter" <| fun mailbox ->
let rec loop() = actor {
let! msg = mailbox.Receive()
match msg with
| Hello name -> printf "Hello, %s!\n" name
| Goodbye name -> printf "Goodbye, %s!\n" name
return! loop()
}
loop()
The exception message includes the following:
System.TypeLoadException: Method 'WatchWith' in type '-ctor#270' from assembly 'Akka.FSharp, Version=1.2.3.41, Culture=neutral, PublicKeyToken=null' does not have an implementation
WatchWith method has been introduced in Akka.NET v1.3, while you're using Akka.FSharp v1.2.3. You'll need to downgrade your Akka dependency back to 1.2.3 (at this point in time Akka.FSharp is not yet available in v1.3).

Read a list from stream using Yap-Prolog

I want to run a (python3) process from my (yap) prolog script and read its output formatted as a list of integers, e.g. [1,2,3,4,5,6].
This is what I do:
process_create(path(python3),
['my_script.py', MyParam],
[stdout(pipe(Out))]),
read(Out, OutputList),
close(Out).
However, it fails at read/2 predicate with the error:
PL_unify_term: PL_int64 not supported
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
I am sure that I can run the process correctly because with [stdout(std)] parameter given to process_create the program outputs [1,2,3,4,5,6] as expected.
Weird thing is that when I change the process to output some constant term (as constant_term) it still gives the same PL_int64 error. Appending a dot to the process' output ([1,2,3,4,5,6].) doesn't solve the error. Using read_term/3 gives the same error. read_string/3 is undefined in YAP-Prolog.
How can I solve this problem?
After asking at the yap-users mailing list I got the solution.
Re-compiled YAP Prolog 6.2.2 with libGMP option and now it works. It may also occur in 32-bit YAP.

Why is RequireQualifiedAccess not working, leading to a compilation error, but not if I use open?

I'm having trouble with RequireQualifiedAccess: despite the attribute, a union case is shadowing a type. Strangely, the error only appears if I use qualified access on the enclosing module, not inside it or if I open it:
module Module =
type [<RequireQualifiedAccess>] Du =
| SomeCase
type [<RequireQualifiedAccess>] SuperDu =
| Du of Du
let valid = Du.SomeCase // Valid, as expected
let invalid = Module.Du.SomeCase // Not defined?!?
open Module
let validToo = Du.SomeCase // Wait, this is valid again?
In the invalid line, there's first a warning that using .Du without qualified access is deprecated, as if I were referring to SuperDu.Du, then it gives an error that SomeCase is not defined.
I always believed that using open X is equivalent to prefixing X. to all definitions taken from that module. But it obviously isn't...?
What is going on here? Do I have to avoid this kind of name collision, despite RequireQualifiedAccess? Is this a compiler bug?
This is an issue in the F# compiler, which has already been reported. For more information see:
[<RequireQualifiedAccess>] on a DU shadows types in the same module
Type inference for a record/class behaves differently when module is open or not

F# Data Type Provider ; error on CSVProvider initialization

I am trying to set up a tiny F# console app with FSharp.Data referenced in the solution. I got the following error at runtime :
An unhandled exception of type 'System.TypeInitializationException' occurred in Anot_F1.exe
for this code (error in line 4) :
1 open FSharp.Data
2 type Anot_lines = CsvProvider<"anot1.csv",Separators=";">
3 let ll = Anot_lines.Load("anot1.csv")
4 for r in ll.Rows do
5 printfn "%A" r.ToString
In debug mode after line 3, I can see that the variable ll contains the proper Headers but does not show the rows.
My CSV file is :
tline;tcol;bline;bcol;anot
3;1;4;16;"Barack Obama has ... The US president"
3;1;3;12;"Barack Obama"
3;18;3;26;"ratcheted"
4;102;4;109;"agencies"
4;289;4;306;"financial pressure"
4;1;4;320;"The US president ...ure on the regime"
4;1;4;16;"The US president"
I am new to F# and especially have no experience on using type providers.
Any help greatly appreciated.
The issue is with line 3, you're using a method that loads CSV data from a URL. You need to use the GetSample() method. Also note that the "%A" format placeholder can print any value and doesn't require a ToString() call.
let ll = Anot_lines.GetSample()
for r in ll.Rows do
printfn "%A" r

Avoid NZEC error in Erlang in SPOJ

I've written code in Erlang, and I get the correct answer on my machine. But when I submit it on SPOJ it gives an NZEC (non zero exit code) error. I have used built-in functions like halt() and init:stop(), and their specification clearly says that they are used to avoid non-zero exit code error. But still I get the same error. How can I solve this problem?
EDIT The code as required by a comment:
-module(factorial).
-export([main/0]).
main() ->
{ok, [No_of_cases]} = io:fread("", "~d"),
loop(No_of_cases).
loop(0) ->
%init:stop();
halt(1);
loop(No_of_cases) ->
{ok, [Number]} = io:fread("", "~d"),
ResultFactorial = find_factorial(Number,1),
io:format("~p~n",[ResultFactorial]),
loop(No_of_cases-1).
find_factorial(0,Product) ->
Product;
find_factorial(Number,Product) ->
find_factorial(Number-1,Product*Number).
I got the answer. The trick is that your module name always has to be tested and the entry point should be function main . For example, after compilation it should be run as tested:main().

Resources