わーん。
accept :: Socket -> IO (Socket, SockAddr)
SockAddr
をユーザが拡張できるようにaccept :: SocketAddress sa => Socket -> IO (Socket, sa)
accept :: Socket -> IO (Socket, SockAddr) accept' :: SocketAddress sa => Socket -> IO (Socket, sa)
ExtendedDefaultRules
は,ここにあるクラスしか,適用できない感がありますねTypeApplication
を使って, accept @SockAddr
とする前提でAPIを設計する(いちよシグネチャを明示的に書けば, TypeApplication
を使わなくても良い)感じはダメなんですかね?OverloadedString
拡張を有効にした時は IsString
にも指定できるんだそうです。 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#overloaded-string-literalsGeneric2
クラスがない理由ってなんか技術的な理由だったりするんでしょうか?$ stack new blog hakyll-template $ cd blog # stack.yaml の resolver を nightly-2018-01-29 に $ stack build
class Foo a where toFoo :: Int -> a fromFoo :: a -> Int
intToInt :: Int -> Int intToInt = fromFoo . toFoo
TypeApplication
ですね。Foo
のインスタンスを使うかで intToInt
の実装は変わってしまうので、 a
からは逃げられない気がしますよね・・・。{-# LANGUAGE TypeApplications #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE AllowAmbiguousTypes #-} class Foo a where toFoo :: Int -> a fromFoo :: a -> Int intToInt :: forall a. Foo a => Int -> Int intToInt = fromFoo . toFoo @a
{-# LANGUAGE TypeApplications #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE GADTs #-} class Foo a where toFoo :: Int -> a fromFoo :: a -> Int instance Foo Integer where toFoo = toInteger fromFoo = fromInteger intToInt :: forall a. (Foo a, a ~ Integer) => Int -> Int intToInt = fromFoo . toFoo @a