参照透過性が満たされることの利点は何ですか

投稿者: Anonymous 参照透過性が満たされることの利点は何ですか? 具体的には変数が代入できることで生じる具体的なバグが知りたいです。 解決 変数はなんらかの計算結果を値として参照するために用います. これにより計算結果の再利用を実現しているわけですね. この参照が透過的であるということは,いつでも変数と参照対象の値を入れ替え可能ということです. 変数は参照対象を変更することはなく,いつも同じ計算結果を参照するということになります. これには2つ利点があります. その計算結果を参照する手段が失なわれないことが(変数の有効範囲では)保証される. その変数で参照している値が意図した計算の結果であるかを確認するためには,その変数を初期化しているところ一箇所を確認すればよい. 変数が参照する対象を変更できてしまうと,プログラマはその変更に気を使う必要があります. 本当にその変数がプログラマが想定している計算結果を指しているかを気にする必要があるということは, それを見落して意図していない計算結果を参照してしまう可能性があるということです. それがバグになるということです. あまり具体的ではありませんが,たとえば,ループ変数をループ制御以外の目的でうっかり使用して, 参照先を変更してしまったことに気づかず,本来のループ制御が意図しない振舞になってしまう, ということがありそうです. 回答者: Anonymous

Haskellの素数判定でコンパイルエラー

投稿者: Anonymous Haskellで、値nが素数ならばTrueを、素数でなければFalseを返す関数primeを作成したいのですが、どのようにプログラムしていいのかわかりませんでした。 最初に要は、値nを2からn−1まで順番に割っていって、最後まで割り切れなければ素数であると判定できるということだと思ったので、以下のようにプログラムしてみました。 a>=2 && a<=n−1 prime(n,a)=if n`mod`a /= 0 then False else True しかし、以下のようなコンパイルエラーが発生しました。 [1 of 1] Compiling Main ( sample1002.hs, interpreted ) sample1002.hs:177:1: error: Parse error: naked expression at top level Perhaps you intended to use TemplateHaskell Failed, modules loaded: none. 私は、modという表現を使用したのはおそらく正しいと思ったのですが、「nを2からn−1まで割っていったときに、割り切れない」という意味のプログラムの表現方法が間違っているのだと考えました。(自分は、それを表現するために、2以上n−1以下の整数をaと置き、nがその整数aで割りきれなかったらFalseを返す関数を作成しました。) どのようにプログラムすればいいのでしょうか。ご回答よろしくお願いします。 解決 Parse error: naked expression at top level これは式がトップレベルにあることがおかしいというエラーです。171行目にそのエラーがあるというメッセージですがおそらく質問者は sample1002.hs…(Continue Reading)

このHaskellプロジェクト(自作)をビルドしようとするとリンカがエラー吐きます

投稿者: Anonymous 実行したコマンド $ git clone http://github.com/aiya000/ahs-diary.git $ cd ahs-diary.git $ git checkout -b tmp origin/tmp $ stack build 以上でリンカ(ld)がMain.oに対してのエラーを吐きます。 環境は Ubuntu 15.04 stack 0.1.2.0 です。 拙い質問で申し訳ないのですが、Haskellに触れられず大変辛いものがあります。 どなたか助けてください…。 下記にエラーをそのまま記します。 “` ahs-diary-0.1.0.0: build Building ahs-diary-0.1.0.0… Preprocessing library ahs-diary-0.1.0.0… In-place registering ahs-diary-0.1.0.0… Preprocessing executable ‘ahs-diary-exe’ for ahs-diary-0.1.0.0… Linking .stack-work/dist/x86_64-linux/Cabal-1.18.1.5/build/ahs-diary-exe/ahs-diary-exe … .stack-work/dist/x86_64-linux/Cabal-1.18.1.5/build/ahs-diary-exe/ahs-diary-exe-tmp/Main.o: 関数 c7kI_info’ 内: (.text+0x54db):ahszmdiaryzm0zi1zi0zi0_DiaryziNew_newDiary2_closure’ に対する定義されていない参照です .stack-work/dist/x86_64-linux/Cabal-1.18.1.5/build/ahs-diary-exe/ahs-diary-exe-tmp/Main.o:…(Continue Reading)

¿Cómo pasar de decimal a binario en Haskell? ACTUALIZADO

publicado por: Anonymous Buenas tardes. ¿Hay alguna función que permita pasar de decimal a binario? Por ejemplo, toBin 12 = [1,1,0,0] toBin 2^38-174 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,0] toBin 1215484521248 = [1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0] He intentado hacerlo mediante recursión, de la siguiente forma, pero es muy poco eficiente, pues en los ejemplos anteriores, ni me lo da en el mismo…(Continue Reading)

Applicative [] の の実装はどのようにして読む(解釈する)のでしょうか?

投稿者: Anonymous 箱で考えるFunctor、ApplicativeそしてMonad – Qiita に載っているサンプルのコード(下記引用)の挙動がすこし不思議だなと思ったので、実際の処理は、実装を読めばわかるだろうと考えました。 > [(*2), (+3)] <*> [1, 2, 3] [2, 4, 6, 4, 5, 6] そこで https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#%3C%2A%3E を見てみると (<*>) :: f (a -> b) -> f a -> f b (<*>) = liftA2 id となっており、じゃあ次は leftA2 を見ないといけないんだなと考えみにいってみると、 liftA2 :: (a -> b -> c) -> f a -> f b ->…(Continue Reading)

`error` を投げることがある巨大な再帰ケースをできるだけ簡単に `Maybe` 化する方法はありますか

投稿者: Anonymous Haskell で、ある再帰直和型 T に対し、 T -> T のような関数があり、既に実装されているとします。たとえば、 data T = Z | One T | Two T T | Three T T T | .. — 沢山あります f :: T -> T f Z = Z f (One t) = One (f t) f (Two t1 t2) = Two (f t2) (f…(Continue Reading)

“-XDatatypeContexts is deprecated”と出てしまうようなコードに対しての、適切な修正方法

投稿者: Anonymous 現在、Haskellを少しでも勉強しようと思い、『関数型プログラミングの楽しみ』という本を写経しています。その中のコードの中に、下記のようなコードが含まれています(全体のコードはこのようになっています)。 この中に、 data Ord a => Tree a = Null | Fork a (Tree a) (Tree a) というコードが出てきます。 おそらくこれは、ドキュメントに書かれてある Data type contexts であると推測しています。実際にrunhaskellのv 7.6.3では-XDatatypeContextsオブションを使うことで動かせることがメッセージで示唆されます。 ですが、このオブションを実際に指定すると: on the commandline: Warning: -XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language. という、「非推奨であるという警告」が出てきてしまいます。 おそらく、なんらかの形で、このdataを理想的なかたちで修正する方法があり、そのようにする必要があると思われるのですが、理解不足のため、どのように修正すればいいのかがよくわかりません。 本家Stackoverflowにも似たような問題として質問に取り上げられてありましたが、若干問題が違うようにも感じられました。今回の場合、どのように修正するのが適切でしょうか。 解決 まず結論から言うと、警告が出ないよう修正するにはデータ型から単に制約を取り除いて data Tree…(Continue Reading)

Comparar elementos de dos listas en Haskell

publicado por: Anonymous He probado a comparar elementos pertenecientes a dos listas en Haskell y no termino de comprender el resultado obtenido. Cito de aprendehaskell.es: Las listas pueden ser comparadas si los elementos que contienen pueden ser comparados. Cuando usamos <, <=, >, y >= para comparar listas, son comparadas en orden lexicográfico. Primero son…(Continue Reading)

Haskellで型エラー: No instance for (Num [[t0]]) arising from the literal ‘1’

投稿者: Anonymous ある数がその要素に含まれているかどうかを判定する関数mを作成したいのですが、実行は出来るものの、実行したときに計算してくれません。 どこが間違っていますでしょうか。回答よろしくお願いします。 作成したプログラム: m([],x)=False m(as,x)=if memberOf(as,x) then True else False memberOf(x,[])=False memberOf(x,a:as)=if x==a then True else memberOf(x,as) 期待している実行結果: *Main> m([100,54,89,27,76,45], 76) True *Main> m([100,54,89,27,76,45], 88) False 実際の実行結果: <interactive>:13:1: error: • Ambiguous type variable ‘t0’ arising from a use of ‘m’ prevents the constraint ‘(Eq t0)’ from being solved. Probable fix: use a type…(Continue Reading)

エラーの意味がわかりません:Couldn’t match type

投稿者: Anonymous 昇順に並んでいる整数リストasに、昇順を維持したまま新しい整数xを挿入する関数interSortedList(as,x)を定義したいのですが、何回プログラムを実行してもコンパイルエラーが出てしまいます。 私は以下のようにプログラムしました。 insertSortedList([],x)=x insertSortedList(a:as,x)=if x<a then x:a:as else sort(as,x) *関数sortはすでに定義積みなので割愛。 片方のリストが空だった場合には、そのまま新しい整数xを挿入するだけなので、xと定義する。(insertSortedList([],x)=x) 両方のリストが空ではない場合、もし、挿入する数字xがa未満の場合、xはリストのどの値よりも小さいので、先頭に挿入する。そうでない場合、リストの残りasの中に挿入する。(insertSortedList(a:as,x)=if x<a then x:a:as else sort(as,x)) このように考えたのですが、次のようなエラーが出てきました。 Prelude> :l sample1002.hs [1 of 1] Compiling Main ( sample1002.hs, interpreted ) sample1002.hs:329:54: error: • Couldn’t match expected type ‘[t]’ with actual type ‘([[t]], [t])’ • In the first argument of ‘sort’, namely ‘(as, x)’…(Continue Reading)

No compiler found, expected minor version match with ghc-8.8.4

投稿者: Anonymous haskell – Docker Hub に Dockerize an application using stack: FROM haskell:8 RUN stack install pandoc pandoc-citeproc ENTRYPOINT ["pandoc"] とあるので、これはDockerfileに記載するんだなと推測して、Dockerfileを作り上記コードを記述しました。 そして下記を実行するとエラーになりました。 % docker build . -t hoge Sending build context to Docker daemon 5.12kB Step 1/3 : FROM haskell:8 —> 28d6a90e41e2 Step 2/3 : RUN stack install pandoc pandoc-citeproc —> Running in 8ad45a57c741…(Continue Reading)

「Implementing a JIT Compiled Language with Haskell and LLVM」 の4章におけるsoファイルのリンク方法について

投稿者: Anonymous Implementing a JIT Compiled Language with Haskell and LLVM (http://www.stephendiehl.com/llvm/) を読み進めていたのですが, 4章のExternal Functions節での, soファイルのリンクがうまくいきません. % gcc -fPIC -shared cbits.c -o cbits.so % ghc cbits.so –make Main.hs -o Main とするとコンパイルは成功するのですが, 実行すると ./Main: error while loading shared libraries: cbits.so: cannot open shared object file: No such file or directory というようなエラーを吐きます. これが自分で書いたものだけでなく, git clone した https://github.com/sdiehl/kaleidoscope/tree/master/src/chapter4…(Continue Reading)

日本語を含む文字列から正規表現を使って抽出する方法

投稿者: Anonymous 日本語を含む文字列から正規表現を使って抽出をしたいのですが、上手くいかなくて困っています。 ライブラリはregex-pcreを使っています。 Stringではマッチする部分がずれるのか、マッチの結果の2つ目に何も入っていません。 ByteStringではマッチする部分は取れているようなのですが、日本語のデータが抜け落ちてしまいます。 import Text.Regex.PCRE “123あいうえお456かきくけこ” =~ “(\d+)(\D+)” :: [[String]] –[[“1231235412356123581236012362&4561236312365123671236912371″,”123″,”1235412356123581236012362&4561236312365123671236912371”],[“”,””,””]] import Data.ByteString.Lazy.Char8 as B B.pack “123あいうえお456かきくけこ” =~ “(\d+)(\D+)” :: [[B.ByteString]] — [[“123BDFHJ”,”123″,”BDFHJ”],[“456KMOQS”,”456″,”KMOQS”]] また、compUTF8というオプションがあったので試してみたのですが let reg = makeRegexOpts compUTF8 defaultExecOpt “(\d+)(\D+)” matchAllText reg “123あいうえお456かきくけこ” — [array (0,2) [(0,(“1231235412356123581236012362&4561236312365123671236912371”,(0,18))),(1,(“123”,(0,3))),(2,(“1235412356123581236012362&4561236312365123671236912371”,(3,15)))],array (0,2) [(0,(“”,(18,18))),(1,(“”,(18,3))),(2,(“”,(21,15)))]] となり、同様の結果のようです。 環境はUbuntu14.04($LANG=ja_JP.UTF-8)、stack0.1.5.0(ghc-7.10.2、lts-3.6)です どうにかして日本語を含むStringかByteStringから正しくマッチさせて抽出することはできないでしょうか? よろしくお願いします。 解決 以下のウェブページを参照しますと、どうやら regex-pcre パッケージのバグの様です。   [Haskell-cafe] regex-pcre is not…(Continue Reading)

Hackage のライブラリを高速にインストールする方法は?

投稿者: Anonymous Hackage からライブラリを cabal でインストールする際にコンパイル時間がかかります。例えば wreq というライブラリをインストールしようとしたところ、依存するライブラリのインストールまで含めて、手元の環境では10分程度かかりました。 依存関係の衝突が怖いため cabal sandbox 内にインストールしています。 バイナリ配布など、ライブラリのインストールを高速化する手段はあるでしょうか? 解決 cabalコマンドにはsandboxのパスを指定する機能があるので、あらかじめ依存関係が壊れない組み合わせであるとわかっていれば、複数のプロジェクトでsandboxを共有することでコンパイル時間を減らせます。 使えるパッケージやバージョンは限られてしまいますが、Stackageを使えばStackageのリリースごとにsandboxを作り、プロジェクトごとに適切なsandboxを指定することで、依存関係を壊すこと無くビルド済みのパッケージを共有できると思います。 回答者: Anonymous

Haskellにおいて、リストのインデックスが0から始まる理由

投稿者: Anonymous haskellの練習で数列の問題を解こうとして、(!!)を使いたいことがありました。そのとき、ふと、疑問に思ったのですが、なぜhaskellではリストのインデックスが0から始まる、と考えるのでしょうか? takeやdropなどを合わせて考えると、1から数えるとした方が、なんとなく、ですが良いような気がするのです。 おそらく、意味があってのことなのだろうと思いますが、なぜなのでしょうか? 解決 例えばCにおいてarrを配列だとすると、arr[5]といった配列へのインデックスアクセスは、ポインタ加算及びメモリアクセス*(arr+5)と等価だとみなされるため高速です。arrは配列のベースポインタ(つまり配列の始まりのアドレス)のことであり、+5というのはここではarrの要素の型のサイズ(例えばlongなら8bit)×5をarrに加算するといった意味論になります。0スタートだとここらへんの最適化処理が簡単になりますというのが極めて一般的な回答だと思われます。 しかしおそらくそれだけが理由でhaskellの言語設計者が0スタートをよしとしたのではないと思います。コンパイラ設計者が頑張れば実はインデクスが1スタートでも問題がないです。だってarr[5]を*(arr+4)と解釈させればいいのですし、例えばfortranも1でスタートしてますよね。 (純粋関数型言語haskellの)設計者たちは必ず次のようなことを考えたはずです。 「宣言的記述arr[5]が命令的にどう実行されるかは重要ではない。6番目の要素を指すべきか、5番目の要素を指すべきなのかが宣言的記述として重要だ。」 そうした判断を踏まえたうえでゼロスタートのほうが好ましいと判断したのではないかとまず考えます。 僕はゼロスタートが採用されているのはメモリアドレスなどのハードウェアが理由ではなくコンピュータサイエンスと親和性の高い数学の集合論に基づいた結果だと考えます。集合論において自然数はゼロから始まります。ラムダ計算におけるチャーチ数や集合論における自然数の定義を見て頂ければわかりますが、ゼロから始めないとマッピングが汚くなります。そのことを踏まえて上記のCの例をもう一度見てもらいたいのですが、宣言的記述arr[5]が命令的記述*(arr+4)にマッピングされるというのは集合のマッピングとしてやはり汚いと思います。宣言的か命令的か、そして綺麗汚いというのは所詮相対的なものですが、上記のような「勝手に引数がデクリメントされる」ようなマッピングを正とすると非常に実装がナーバスになると思いませんか? 個人的所感では納得頂けないとは思うので、ダイクストラ先生の意見も引用いたします。 http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html 回答者: Anonymous

Separar una lista de Haskell en una tupla de pares e impares

publicado por: Anonymous Tengo la siguiente función: ParesImpares:: [Integer] -> ([Integer],[Integer]) Tengo que sacar de una lista los pares e impares: ParesImpares [3,2,4,5,7] -> ([2,4],[3,5,7]) Mi código hasta ahora es el siguiente: paresImpares :: [Integer] -> ([Integer],[Integer]) paresImpares [] = ([],[]) paresImpares [x] | x `mod` 2 == 0 = ([x],[]) | otherwise = ([],[x])…(Continue Reading)

Haskell の レコード構文(Record Syntax) にて、より簡潔にフィールド(field)にアクセスする方法はありませんでしょうか。

投稿者: Anonymous 以下のようにレコード構文(Record Syntax)にて独自の名前付きフィールド(Named Fields)らを定義し、フィールド(Field)の一部を利用する場合に、より簡潔な方法はありませんでしょうか? 下記のコードでいえば fNumField Foo{hoge = x} = x ^ 2 の部分が粗雑に感じます。 data Foo = Foo{ bar :: String , hoge::Integer} deriving (Show) main = do print $ fNumField a where fNumField Foo{hoge = x} = x ^ 2 a = Foo{ bar = “piyo”, hoge = 575 } ※ (別の質問の方がいいのかもしれませんが) F#…(Continue Reading)

Haskellの合成関数「insSort」の定義方法

投稿者: Anonymous 並べ替え対象のリストを先頭の要素と残りの要素のリストに分けたとき、残りの要素のリストを並び替えたものに先頭の要素を挿入する関数insSortを、昇順に並んでいる整数リストasに、昇順を維持したまま新しい整数xを挿入する関数「insertSortedList(as,x)」を用いて作成したいのですが、何度試行を繰り返してもエラーメッセージが出てきてしまいます。 ちなみに私は以下のようにプログラムしました。 insertSortedList ([], x) = [x] insertSortedList (a:as ,x) = if x < a then x:a:as else a:insertSortedList(as, x) insSort([],bs)=bs insSort(a:as,bs)=if a<bs then a:insertSortedList(as,bs) else insertSortedList(as,bs) エラーメッセージ [1 of 1] Compiling Main ( sample1002.hs, interpreted ) sample1002.hs:333:31: error: • Occurs check: cannot construct the infinite type: t ~ [t] • In the expression:…(Continue Reading)

Haskell にて、無名関数(anonymous function)を表示する方法はありませんでしょうか

投稿者: Anonymous 例えば、以下のような式をエラーを出さずに出力したいと思います。 x -> x ^ 4 (^4) map (^4) ghci(対話環境) で試していたところ show (x -> x ^ 4) では、 以下のようなエラーがでてしまいます。 Prelude> show (x -> x ^ 4) <interactive>:6:1: No instance for (Show (a0 -> a0)) arising from a use of ‘show’ In the expression: show ( x -> x ^ 4) In an equation…(Continue Reading)

Haskell の レコード構文(Record Syntax)にて、簡潔なフィールド名を定義すると重複しやすい問題の解決方法

投稿者: Anonymous Haskell の レコード構文(Record Syntax)にて、簡潔なフィールド名を使い定義すると名前がかぶりやすくなる問題があります。 参考サイト を見ると、レコード名をprefixとしたフィールド名を使うとよいようですが、こんなものなのでしょうか? よりよい方法はないものでしょうか? エラーになる例: data Java = Java { power :: Integer ; url :: String } data Link = Link { title :: String ; url :: String } — 下記が定義されるためか、重複してしまう — url :: Java -> String — url :: Link -> String エラー内容: Multiple declarations of ‘url’…(Continue Reading)

Haskellの(>>=)におけるモナド則の適用について

投稿者: Anonymous https://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96 にfmapとjoinを使ったモナド則としてjoin . fmap (fmap f) = fmap f . joinというものがあります。 ここで(>>=)の定義はx >>= f = join (fmap f x)なので、 (>>=)を使った計算に対してm >>= f >>= g = join . join . fmap (fmap g) . fmap f $ mという変換ができることになると思います。つまりjoinを後からまとめて行うという変換です。 これは(>>=)をいくつ繋げても同じように変換可能ですが、そもそもこの形のモナド則をf :: a -> m bのような関数に適用していいのでしょうか? 説明での前提はf :: a -> bの関数のようですが。 追記 m >>= f =…(Continue Reading)

Haskellのpattern bindingについて

投稿者: Anonymous 背景 テスト環境はGHC7.8.3です。 以下の情報は4 Declarations and Bindingsを参照しています。 Haskellにはpattern bindingとfunction bindingという2種類の束縛があります。この内、pattern bindingは p | gs1 = e1 | gs2 = e2 … | gsm = em where { decls } という一般形を持ちます。またsimple pattern bindingとはp = eの形のpattern bindingのことです。 ところでMonomorphism Restrictionという仕組みがあります。これは大雑把に言うと、型変数の一部を具体的な型で置き換えてしまうものです。文書にはfunction bindingと型シグネチャを伴うsimple pattern bindingのみMRの影響を受けないと書かれています。またnon-simple pattern bindingの場合、型シグネチャのあるなしに関わらず制約のある型変数を単相的にしてしまうとも書かれています(従ってMRにより具体的な型を持つ)。 そこでこの仕様をテストすることにしました。non-simple pattern bindingを (一般形) – (simple pattern binding) = ガードとwhere付きのpattern binding であると考え、次のようなコードを試してみました。…(Continue Reading)

Text.Parser.Token.StyleのemptyIdentsの使い方について

投稿者: Anonymous X(数字)という形式の識別子をパースするパーサーをparsersライブラリで書こうと思い、Text.Parser.Token.Style.emptyIdentsを使って以下のようなIdentifierStyleを定義しましたが、型エラーになってしまいます。 import Text.Trifecta import Text.Parser.Token.Style identStyle :: IdentifierStyle Parser identStyle = emptyIdents { _styleStart = char ‘X’ :: Parser Char, _styleLetter = digit :: Parser Char } — パーサをこのように定義したい(例: “X3” -> Var 3) ident = Var . (read . tail) <$> ident 現状はとりあえずnaiveにident = Var . read <$> (char ‘X’ >> many digit)と定義していますが、何故上のコードで型エラーが出るのか知りたいです。…(Continue Reading)

Haskell で実行可能スクリプトを記述するには?

投稿者: Anonymous Haskell でちょっとしたツールを記述する際に、いちいちプロジェクト (というかビルド設定など) を作成し、スクリプトに修正を加えるたびにビルドをいちいち回しなおすのは、手間です。 実行可能スクリプトとして、 Haskell を記述することはできないでしょうか? 解決 Stack を使っているなら、stack exec と組み合わせることで連携できます。この方法は GHC のバージョンの指定や外部パッケージの追加など、よりきめ細かい設定をすることができます。 $ stack exec — runghc HelloWorld.hs Hello World! あるいは $ stack runghc — HelloWorld.hs Hello World! Yuki Inoue さんの回答のように、この方法はより簡略化でき、また shebang にすることもできます。 Shebang として書いたとき、バージョン指定は以下のように行えます。 #!/usr/bin/env stack — stack –resolver lts-3.2 –install-ghc runghc main = putStrLn “Hello World!” (上のコードは、James Brock さんによる…(Continue Reading)

HaskellにおいてDRY原則に反した型設計の改善

投稿者: Anonymous Haskellで設計を行っている時に、どうしてもDRY原則に反し、煩雑になってしまうコードが有ります。 特に、型クラスを使っている時にこの問題が発生することがあります。 実際の状況はかなり複雑で書ききれないので、重要な部分だけを取り出して問題形式にしました。 どのようにすればこの問題を解決できるでしょうか? また、根本的に問題の捉え方が誤っているなどがあればご指摘いただければ幸いです。 {- 以下の条件で実装をするものとする。 まず、データ型X, Y, Zがあり、データ型は頻繁に追加されることが予想される。 (つまり、拡張性を高く保っておく必要がある) あなたは、標準出力から、一行目にデータ型の種類を指定され、二行目にパース可能なデータが与えられる。 そのデータをパースし、データに対してある動作B(サンプル実装ではfuncBとした)を行ったあとに、 所与の動作A(funcA)を実行する必要がある。 サンプル実装では、test関数にその処理をまとめたが、これは明らかにDRY原則に反している。 サンプル実装をどのように改善すればDRY原則を守ることができるか。 (サンプル実装の中身はすべて書き換え可、動作Bはundefinedでよい) -} module Problem where ———————————————————————- — 条件 data X = X data Y = Y data Z = Z class Parsable a where parse :: String -> a instance Parsable X where parse = undefined instance…(Continue Reading)

VSCode上でhaskell-ide-engineサーバーがクラッシュする

投稿者: Anonymous VSCode上でhaskell-ide-engineサーバーがクラッシュします。 VSCodeのエラー内容は以下の文章です。 “The Haskell HIE (test) server crashed 5 times in the last 3 minutes. The server will not be restarted.” 環境は Windows 10 Home 64bit Stackのインストールには、以下の公式インストーラを利用しました。 “stack-1.7.1-windows-x86_64-installer” Stackの保存場所は、以下の通りです。 “C:Users******AppDataRoaminglocalbin” haskell-ide-engineのインストールには、以下のバッチファイルを利用しました。 “make-build-all.bat” haskell-ide-engineの保存場所は、以下の通りです。 “D:WorkSpaceHaskellhaskell-ide-engine” haskell-ide-engineのためのVSCodeのUser Settingsで、以下を追加したり消したりしたのですが、ダメでした。 “languageServerHaskell.useHieWrapper”: true 解決策が見当たりません…… 追記1 Q. stack exec hie-wrapper — –lsp –debug の実行するとどうなったか A. 以下が出力されました。 WWAARRNNIINNGG:: ccaacchhee iiss oouutt…(Continue Reading)

¿ Cómo transformar un string a una lista de string en haskell

publicado por: Anonymous tengo esta cadena “la luna,el sol,a,b,c” y quiero convertirla a [“la luna”,”el sol”,”a”,”b”,”c”] sin usar librerías ¿ Cómo puedo hacer? Tengo este código que me devuelve “la luna,el sol,a,b,c” pero deseo convertirlo en una lista de string archivo <- readFile “MAPA.txt” nuevoarchivo <- return(lines archivo) cadena <- return(limpiarlista $ head nuevoarchivo) print…(Continue Reading)

Haskellで以下のエラーが出てしまう

投稿者: Anonymous 「プログラミングHaskell」を勉強していて、9章サンプルコードが実行できず困っています。 https://github.com/macalimlim/programming-in-haskell/blob/master/Chapter9.hs 以下のコードを実行しようととすると、このようなエラーが出てしまいました。 どなたか詳しい方、ご助言頂けるとありがたいです。。 Parsing.hs:8:10: error: • No instance for (Applicative Parser) arising from the superclasses of an instance declaration • In the instance declaration for ‘Monad Parser’ Parsing.hs:14:10: error: • No instance for (GHC.Base.Alternative Parser) arising from the superclasses of an instance declaration • In the instance declaration for ‘MonadPlus Parser’ コード…(Continue Reading)

Haskellのラムダ式のパターンマッチに関する質問です。

投稿者: Anonymous Haskellを勉強して1週間ほどなので、馬鹿らしい質問かもしれませんがあらかじめ御了承ください。 Haskellの勉強中にふとラムダ式でパターンは使えるのかと思い、下のような関数を作りました pow :: Num a => a -> Integer -> a pow x = do -> 1 1 -> x 2 -> x * x n -> if even n then pow (pow x 2) (n `div` 2) else x * pow (pow x 2) ((n – 1) `div` 2) しかし、これを実行するとコンパイルは通るのですが、無限ループになってしまっているようなのです。 なぜ、無限ループの陥ってしまうのかを教えていただきたいです。…(Continue Reading)