haskell-jp / beginners #20 at 2022-02-23 13:52:59 +0900

はじめまして。
Maybe Int のような型から`Int` 型を取り出すことは可能なのかお聞きしたいです。
やりたいこととしてはtypescriptの以下のような推論をやってみたい感じです。
type A<T> = { a: T }
type B<F> = { b: F }

type C = A<B<number>>

type GetT<AA extends A<any>> = AA extends A<infer T> ? T : never
type GetF<BB extends B<any>> = BB extends B<infer F> ? F : never

type D = GetF<GetT<C>> // number

よろしくおねがいします。
以下のようにType Familyを使えば実現できるはずです
{-# LANGUAGE TypeFamilies #-}

import Data.Proxy

data A t = A { a :: t }
data B f = B { b :: f }
type C = A (B Int)

type family GetT a where
    GetT (A t) = t
    
type family GetF a where
    GetF (B f) = f
    
type D = GetF (GetT C)


eq :: Proxy (D ~ Int)
eq = Proxy

main = putStrLn "typechecked"
Type Familyは大雑把にいうと型から型への関数のようなものという認識です
https://qiita.com/rooooomania/items/c6da1158d676e6fe87e2
https://wiki.haskell.org/GHC/Type_families
type familyという概念をはじめて知りました。
調べてみます。ありがとうございます!