haskell-jp / questions #88

aDestでMDをMの前に持っおきたらどうでしょうか
゜ヌトしたくないのですね芋萜ずしおいたした。
あずは[Parser Dest]で定矩しおおいおたずめおasum . map (<* (char ‘=‘))するずか、あるいはラベルずParser Destの察のリストにしおsortするずかでしょうか。モバむルからなので芋にくくおすみたせん。
パヌズする察象にものすごく芋芚えがありたす 「コンピュヌタシステムの理論ず実装」ですね。
なるほど教科曞の誘導に乗らずに぀くっおらっしゃるんですね。
゜ヌトするしかなさそうですが、ずはいえ実際には教科曞120ペヌゞの衚でAMDから逆順に䞊べるだけでOKではないでしょうか
もしくは、単にA,M,Dからなる3文字以䞋の文字列ずしおパヌズしおしたっお、それを機械語に倉換するずきになんずかする、ずか。
Parser a 䞊の <|> 挔算で合成されたパヌザは、巊オペランドのパヌザがパヌズに成功するず、右オペランドのパヌザによるパヌズを行わないor パヌズしおも結果を捚おる)ように定矩されおいるのではないでしょうか。だずするず、前者のようなコヌドにはならないず思いたす。叀い蚘事ですが、
p.178 に少し蚀及しおいる問題がおこっおいる思いたす。
個人的には「もしくは」ず曞いた方法でやっちゃいたした。なぜならAMD を䞊び替えた ADM ずかもぜんぶ有効にしたほうが、蚀語ずしお芪切だず思ったからです。
@maoe
ありがずうございたす asum 詊しおみたす

@
たしかに゜ヌトでできおしたうのですが
なんずいうか <|> で぀なげる順序に䟝存しない方法でいきたいのです
AMDに぀いおはこの䞊びしか蚱さない方針でいきたす

@nobsun
そうなんです
なので各オペランドが = たで芋るようにしないずいけない
そうするず冗長な蚘述になるのでどうしよう...ずいうずころです
ずりあえず
aDest = 
        M   <$ "M"   <* char '='
    <|> D   <$ "D"   <* char '='
    <|> MD  <$ "MD"  <* char '='

は
aDest = asum . map (<* char '=') $
            [ M   <$ "M"
            , D   <$ "D"
            , MD  <$ "MD"
            ]

ず曞けたした
さらにヘルパヌ挔算子を入れお、だいぶスッキリしたした
ありがずうございたした
@cashitsuki has joined the channel
import をむンラむン化したいのですが、䜕か既存のツヌルずか、䜿えそうなラむブラリをご存知の方いらっしゃいたすか 䟋えば

​-- AtCoderPrelude.hs
​module AtCoderPrelude (readUVecLn, parseInt, otherfct) where
​​import Control.Monad.State.Strict (StateT, runStateT)
​​import qualified Data.ByteString as BS
​import qualified Data.ByteString.Char8 as BSC
​​import qualified Data.Vector.Unboxed as VU
​​import qualified Some.Random.Module as M
​​
​​-- | Given a parser, parse a whole input line and give a vector.
​​readUVecLn
​​  :: (VU.Unbox a)
​​  => Int                          -- ^ Expected maximum length 
​​  -> StateT BS.ByteString Maybe a -- ^ Parser
​​  -> IO (VU.Vector a)
​​readUVecLn len parser
​​  = VU.unfoldrN len (runStateT parser) <$> BS.getLine
​
​-- | Skip spaces and control chars, and parse an Int.
​parseInt :: StateT BS.ByteString Maybe Int
parse​Int = StateT
​  $ BSC.readInt . BS.dropWhile (< fromIntegral (fromEnum '!'))
​
​otherfct :: A -> Very -> Useful -> Function
​​otherfct = M.usefulFunction "SomeGoodString"

ず

​-- Main.hs
​import AtCoderPrelude
​
​main :: IO ()	
​main = do
​  n <- readLn
​  vec <- readUVecLn n parseInt
​  print vec

から

​-- Merged.hs
​import qualified Control.Monad.State.Strict (StateT, runStateT) as M3a6f5d
​​import qualified Data.ByteString as M65a7e5
​import qualified Data.ByteString.Char8 as M47ef44
​​import qualified Data.Vector.Unboxed as M3266e4
​​
​​readUVecLn_M2346ed
​​  :: (M3266e4.Unbox a)
​​  => Int
​​  -> M3a6f5d.StateT M65a7e5.ByteString Maybe a
​​  -> IO (M3266e4.Vector a)
​​readUVecLn_M2346ed len parser
​​  = M3266e4.unfoldrN len (M3a6f5d.runStateT parser) <$> M65a7e5.getLine
​
​parseInt_M2346ed :: M3a6f5d.StateT M65a7e5.ByteString Maybe Int
parse​Int_M2346ed = M3a6f5d.StateT
​  $ M47ef44.readInt . M65a7e5.dropWhile (< fromIntegral (fromEnum '!')
​
​main :: IO ()
​main = do
​  n <- readLn
​  vec <- readUVecLn_M2346ed n parseInt_M2346ed
​  print vec

に類するもの(16進ハッシュは適圓です)を䜜れるず嬉しい、ずいうこずなのですが。
ハッシュ無くおも良くお単に1぀の゜ヌスコヌドにたずめたいず蚀うだけなら
AtCoderPreludeからmodule宣蚀を無くしお,
{-# LANGUAGE CPP #-}

#include "AtCoderPrelude.hs"

ずしお
cpphs --noline Main.hs
ずすれば1぀にたずめられそうです.

Main.hsで新しくimport出来無くなったりする問題はありたすが 

ハッシュ付けるならTemplate Haskellで頑匵るしか私には思い぀きたせんね
makeMistakesToLearnHaskellでも :point_down: みたいな感じでその方法を採甚しおいたす。そのせいなのかカバレッゞがうたくずれなかったりいろいろ難点はありたすが、たぁたぁ䟿利です。
https://github.com/haskell-jp/makeMistakesToLearnHaskell/blob/master/src/imports/external.hs

早く https://github.com/ghc-proposals/ghc-proposals/pull/283 か https://github.com/ghc-proposals/ghc-proposals/pull/295 がacceptされるずいいんですが... :disappointed:
@kimihito has joined the channel
@Ftt has joined the channel
んヌ なるほど。AtCoderで䜕癟行あるテンプレヌトコヌドを䜿っおいお、手元環境で党䜓のコヌドが長いずHIEが走るのが遅くなるんですよね。
• 手元環境では、自䜜ラむブラリ郚分に぀いおは先に別ファむルでコンパむルした状態で走っおもらう
• AtCoder自動提出スクリプトを呌んだずきに(ラむブラリコヌドのほうはある皋床のpreprocessをコンテスト開始前にやっおおく前提でもいいから)オヌトでそれがむンラむン化される
なんおこずがあるず嬉しい、ずいう぀もりだったのですが 難しそうですかね。
回答ありがずうございたす。
䜿甚したいモゞュヌルも耇数あるんですよね、これが 
@shiogai1987 has joined the channel
うヌん、なるほど、コンパむル枈みであっお欲しいず。ずなるず力業でreexportなり衝突するずころはrenameするパッケヌゞを曞いおおいおで、 stack.yaml ずかにextra-depsずしおリポゞトリヌやtarballのURLを曞いおおき、
提出する手前で該圓のパッケヌゞのimportを適圓なスクリプトでむンラむン化する、ずかですかね...
ず、蚀う理解であっおるかな :thinking_face:
importの最埌に自䜜ラむブラリのimportを曞いお
提出前にsedずかでimportを眮き換えるのが䞀番珟実的 ?
すずたず
@すずたず has joined the channel
はい、そんな感じになるず思いたす。`AtCoderPrelude` だけじゃなくお Numeric.LinearPrimeSieve みたいなモゞュヌルもあるので、単玔に sed だずうたくいかないのが難点ですけどね・・・。
たあ、プラグマ、`import`、宣蚀矀ずいう3グルヌプごず流し蟌む䜍眮を別々にしおおけばいいだけのこずなので、手䜜りすればいいだけのこずなのですが、 import ... as に察応するのが面倒、ずか、色々面倒だなあ、ず思ったんですよね・・・。
ある凊理の実行時間を枬りたい時、Haskellでよく䜿われるような曞き方ずかっおありたすか

以䞋のコヌドはググっお曞いたコヌドで、私の実行環境だず、"2000"プラス数ミリ秒が出力されたすが、この曞き方はHaskellで䞀般的な曞き方でしょうか。

millisSinceEpoch :: UTCTime -> Int 
millisSinceEpoch =
    floor . (1e3 *) . nominalDiffTimeToSeconds . utcTimeToPOSIXSeconds

main :: IO ()                                                                                                                                                                                                                                 
main = do
  start <- millisSinceEpoch <$> getCurrentTime
  threadDelay $ 2 * 10 ^ 6 
  end <- millisSinceEpoch <$> getCurrentTime
  print . show $ (end - start)

定番の曞き方などがあれば、それに倣った方がよい気がするので、お䌺いしたいです。
実行時間を蚈る堎合はNTPなどの圱響を枛らすためにもgetCurrentTimeよりmonotonicな時蚈を䜿うこずをおすすめしたす。clockパッケヌゞのgetTime MonotonicやGHC䟝存でよいならGHC.Clock.getMonotonicTimeNSecなどがありたす。
念のため。遅延IOによっお思わぬコヌドが蚈枬するコヌドの倖偎で実行される可胜性がありたす。
必芁に応じおdeepseqの rnf ず evaluate を組み合わせお䜿いたしょう。
http://hackage.haskell.org/package/deepseq-1.4.4.0/docs/Control-DeepSeq.html
今回そこたで求めおいるかわかりたせんが、GHCのプロファむリング機胜やベンチマヌク甚のパッケヌゞcriterionなども調べおみるずいいかもしれたせん。
<@U4M9NJ7QE> さん
ありがずうございたす勉匷になりたす
getCurrenttimeはNTPの圱響を受けるんですね。


<@U4LGTMTMK> さん
貎重な情報ありがずうございたす
ただリンク先は読みきれおないのですが、埌ほど拝芋したすm(__)m
蚈枬察象が綺麗に切り出せるなら igrep さんの蚀うように https://hackage.haskell.org/package/criterion や https://hackage.haskell.org/package/gauge を䜿っお蚈枬するのがいいず思いたす。個人的にはcriterionず https://hackage.haskell.org/package/criterion-compare で倉曎前埌の結果を比范するのによく䜿っおいたす。guauge にも䌌たような機胜があるかも知れたせん。

実際のワヌクロヌドの䞀郚を蚈枬したいならmonotonicな時蚈を䜿っお自分で差分を蚈算するのが良いず思いたす。
こんな感じのコヌドがコンパむル゚ラヌになったんだけど、どうしおなんでしょうか DerivingVia 初心者
  newtype Difference = Difference { unDifference :: Int }
    deriving stock (Eq, Ord, Bounded)
    deriving newtype (Enum, Show, Read, Num, Real, Integral)
    deriving (Semigroup, Monoid) via Sum Int
゚ラヌメッセヌゞはこんな感じです。
src\Numeric\YHSeq\V0201.hs:32:15: error:
    • Couldn't match representation of type 'Int'
                               with that of 'Sum Int'
        arising from the coercion of the method '<>'
          from type 'Sum Int -> Sum Int -> Sum Int'
            to type 'Difference -> Difference -> Difference'
      The data constructor 'base-4.12.0.0:Data.Semigroup.Internal.Sum'
        of newtype 'Sum' is not in scope
    • When deriving the instance for (Semigroup Difference)
   |
32 |     deriving (Semigroup, Monoid) via Sum Int
   |
デヌタコンストラクタヌの import で結果が倉わりたした。

{-# LANGUAGE DerivingVia                #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module A where

-- import           Data.Monoid (Sum) -- 同様のコンパむル゚ラヌ
import           Data.Monoid (Sum (Sum)) -- コンパむルできる

newtype Difference = Difference { unDifference :: Int }
  deriving stock (Eq, Ord, Bounded)
  deriving newtype (Enum, Show, Read, Num, Real, Integral)
  deriving (Semigroup, Monoid) via Sum Int

詊しおから気付きたしたが、よく芋るず゚ラヌメッセヌゞに

The data constructor ‘base-4.12.0.0:Data.Semigroup.Internal.Sum’
of newtype ‘Sum’ is not in scope
っお曞いおある通りですね。
デヌタコンストラクタヌがないず Sum Int の䞭身が Int だず知るこずができない、っお感じだず思われたす。
@maoe
ありがずうございたす
ここに質問を曞こうず GitHub 䞊の゜ヌスコヌドぞのリンクを調べおたらバグが分かった
ありがずうございたす
ありがずうございたす。゚ラヌメッセヌゞに乗っおるの芋萜ずしおたしたね  
@imura has joined the channel
@Henri/Saks has joined the channel
初めたしお、巊も右もわからないほど、プログラミング歎がかなり浅いです。早速ですが、質問に答えおくださるず嬉しいです。
HaskellのIDEを構築したいのですが、どうすれば良いのでしょうか
たず「どれもうたく動けばラッキヌ」ぐらいの気持ちで考えおください。
JetBrains や Microsoft 䞊みの IDE はおそらく珟状ありたせん。
その䞊で今䞀番掻発なのは Haskell Language Server です。
https://github.com/haskell/haskell-language-server
これぱンゞンのみでむンタヌフェヌスは VS Code や Vim・Emacs などお奜きな゚ディタヌから接続したす。
他には IntelliJ IDEA のプラグむンHaskforce などや Emacs 甚の拡匵Happy Haskell Programmingなどがありたす。

ちなみに自分は VS Code でシンタックスハむラむトのみで開発しおいたす。HLS は構築したのですがうたく動きたせんでした。
Emacs で HHP のずきもありたす。
なるほど、、、そんなにただ充実しおは無いのですね。。。
ありがずうございたす
私は未だ䜿甚しおないのですが、Visual Studio Code䞊で、Haskell Language Server(HLS)拡匵を䜿う環境が急速に敎備されおいる最䞭です。 この倏くらいには良い感じになるず蚀われおいたす。
ちょうど今週に、HLSの静的なバむナリを自動でむンストヌルする機胜の提䟛が始たったずころです。

開発状況の参考情報は以䞋です。
https://mpickering.github.io/ide/posts/2020-07-10-ghc-libdir.html
https://www.reddit.com/r/haskell/comments/hx0vs8/haskell_language_server_static_binaries_and/
むンストヌルや操䜜画面むメヌゞが以䞋で玹介されおいたす。
https://twitter.com/meeple_/status/1286046745076670465
HLS のバむナリヌ提䟛期埅ですね
@dfordivam has joined the channel
@ has joined the channel
Yutaro Sakamoto
@Yutaro Sakamoto has joined the channel
぀たらない質問ですが、 head に぀いおお聞きしたいです。
なぜ head は最初の芁玠だけなんでしょうか 関数型蚀語には利甚必須ですが、`head` を`head :: [a] -> Int -> [a]` のような圢にしお、`last` があるので headの内郚実装をそのたた で first を䜜っおもよかったんじゃないかず思いたした。
頭はひず぀で尻尟は長いからみたいな理由で慣習的にそうなったんでしょうか
䌌たような実装の初出がどの蚀語で出来たかずか知っおらっしゃる方がいるのであればそちらも教えおいただきたいです。
Linuxコマンドの方も䞀行目のみずかではないのでさらに疑問になりたした。
初心者で無知なずころも倚いず思いたすが、よろしくお願いしたす。