わーん。
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