haskell-jp / general #16

@ulfhorst has joined the channel
@ has joined the channel
@ has joined the channel
参加しました!
すごいH本で勉強中のHaskell初心者です、よろしくお願いします:man-bowing:
Kazuki Yoshida
はじめまして!Haskell 初心者の吉田と申します。
基本的なことをお聞きしたいのですが、Haskell では変数や関数の型情報を出力するメソッドなどはありますでしょうか?
ghci では :type コマンドで見れるようですが、スクリプトとして実行(rungch main.hs など)する方法がなかなか調べても出てこず..

Golangでいうと
fmt.Printf("%T", "hello") // string
というようなものを探しています
Data.Typeable を import して, showType = show . typeOf という関数を呼び出せば文字列が得られます.これを出力することで可能です(一部この方法でできないものもありますが,大抵は大丈夫だと思います)

GHCi 上でも次のようにできます:
>>> import Data.Typeable
>>> showType = show . typeOf
>>> putStrLn $ showType $ Just 1
Maybe Integer


ところで,コンパイルエラーで型を教えてくれるTyped Hole という機能が, GHC には搭載されており,型を知りたい式に (Just () :: _) <> Nothing というように :: _ という表記を記載すると型情報をコンパイル時にエラーメッセージとして表示してくれます.GHCi 上でも可能で
>>> (Just () :: _) <> Nothing
(Just () :: _) <> Nothing

<interactive>:8:14: error:
    • Found type wildcard '_' standing for 'Maybe ()'
      To use the inferred type, enable PartialTypeSignatures
    • In an expression type signature: _
      In the first argument of '(<>)', namely '(Just () :: _)'
      In the expression: (Just () :: _) <> Nothing
    • Relevant bindings include
        it :: Maybe () (bound at <interactive>:8:2)


という感じです(少し見にくいですが,上のメッセージが主で “Found type wildcard ‘_’ standing for ‘Maybe ()’” で型が Maybe () であることを教えてくれます)
あ、 typeOf を使う際の注意点を一つ言い忘れていましたが、型変数を伴う型ではうまく動きません。例えば、
f :: a -> String
f x = show $ typeOf x

といったことはできません(これの回避策はあって、Typeable の型制約を追加すると出来るのですが、基本無理だと思ってもらった方が良いです)。型変数を含まない式のみで可能です。

なお、 Typed Hole はそのような制約はないので、もし型の確認が目的なら Typed Hole の方が良いと思います
ついでに表層のデータ型の名前だけを取得したいならもう1つ方法があり
>>> import GHC.Generics
>>> putStrLn $ datatypeName $ from $ Just 1
Maybe

ということも可能です.こちらの方法は自分で定義した型の情報を見たい場合は
{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics

data A = A deriving Generic

みたいなことが必要なのと,この方法では名前の取得が無理なものもかなりある上, Typeable の手法と同じく完全な型変数になっている
f :: a -> String
f x = datatypeName $ from x

のようなものは無理という制約がありますが,
f :: a -> String
f x = datatypeName $ from $ Just x

のようなことは可能です(これは Typeable ではできません).
Kazuki Yoshida
なんと..!大変ご丁寧に回答してくださってありがとうございます!
コンパイル時にメッセージ出力という方法もあるんですね、自分が知っている他の言語にはなかった機能でとても面白いです

基本的に具体型ならとれるようになっているみたいですね(理解が間違っていたらすみません)、
まさに回答いただいたようなことがしたかったので大変助かります
Kazuki Yoshida
解説いただいた手法を一通り試してみたいと思います!
@yki0311 has joined the channel
@ has joined the channel
@sarashino has joined the channel
@efjay has joined the channel
@ has joined the channel
@yuukis123 has joined the channel
はじめまして!
haskellは「haskell入門」を一冊だけ持っているhaskell初心者です。
よろしくお願いします!
@y-shishikura has joined the channel
attoparsec Text.Lazyは,Parsecを使ってるらしく,Strictにして,Conduitで処理するようにしたら10倍以上早くなりました. Text.Lazyを使っては駄目ですね.
@gemmaro has joined the channel
はじめまして。HaskellもSlackも初心者です。よろしくお願いします。
@たき has joined the channel
@hygxsh2k has joined the channel
@ has joined the channel
@amutake has joined the channel
@ has joined the channel
去年の春にHaskellでプログラミングを始めた学生です
初心者ですがよろしくお願いします。
@y-tsune has joined the channel
@zfhrp7 has joined the channel
:sakulambda: Haskell Day 2019 日付アンケート :sakulambda:

今年のHaskell Dayも、去年と同様11月の土曜に開催しようと思います。そこで、会場を確実に押さえ、我々運営へのプレッシャー :muscle: を高めるためにも開催日を早めに決めてしまおうと思います。
以下の日程でご都合いかがでしょうか。
emojiをクリックしてご回答ください。
期限は4月10日(水)の朝(私が確認するまで)とします。

:one: 11月2日(土)
:two: 11月9日(土)
:three: 11月16日(土)
:four: 11月23日(土)
:five: 11月30日(土)

といっても、まだそんなのわかるかよ!という方も多いと思います。私もわかりません :sweat_smile:
なので 複数回答あり です。すべての emoji をクリックしても問題ありません!
身近な方の誕生日 :birthday: など、大事なイベントが実は控えていた!
なんてことがないように、今一度ご確認ください。

参考 去年のHaskell Day: https://haskell-jp.connpass.com/event/92617/
ちなみに、このworkspaceには https://simplepoll.rocks/ も入っておりますが、無料版だと100 votes each monthだそうなので諦めました... :disappointed:
@πk has joined the channel
@CYBAI has joined the channel
@CycloneT has joined the channel
@ has joined the channel
@ has joined the channel
@Makoto Hamana has joined the channel
@askjfbd has joined the channel
遅くなりましたがこちら締め切ります!皆さんご回答ありがとうございました!結果は画像の通りですので、11月9日(土)にしたいと思います!
すみません、一点大事なことが漏れてました。
今回会場を提供していただく予定の、TECH PLAY Shibuyaに正式に許可をいただくまで完全な決定ではありません(先ほど連絡しました)。
まぁ、11月の問い合わせはまだ来てないとのことなんで大丈夫でしょうけども。念のため。
こちら、TECH PLAY Shibuyaより正式に許可をいただけました!
@米栂 has joined the channel
@AnnPin has joined the channel
@ekmett has joined the channel