하스켈 유형을이 표현으로 만드는 방법이 있습니까?
ls = [4, 3.2, True, "home"]
친구가 나에게 준 도전이지만 아이디어가 나오지 않고 가능한지 말하지 않았으므로 소중한 시간을 낭비하고 있을지도 모릅니다.
농담으로 다음과 같이 할 수 있습니다.
{-# LANGUAGE OverloadedStrings #-}
import Data.String
instance Num Bool where
fromInteger 0 = False
fromInteger _ = True
instance Fractional Bool where
fromRational 0 = False
fromRational _ = True
instance IsString Bool where
fromString "" = False
fromString _ = True
ls = [4, 3.2, True, "home"]
그러나 이것은 의미가 없습니다.
식의 형식이 기본이 아닌 경우 주석에 쓴대로 ExistentialType
. 하지만 그렇게하는 데는 많은 변형이 있습니다. 사용 Data.Dynamic
에서 사용자 정의 존재 유형까지.
예를 들면 다음과 Data.Dynamic
같습니다.
import Data.Dynamic
ls = [toDyn (4 :: Int), toDyn (3.2 :: Double), toDyn True, toDyn "hello"]
사용자 정의 유형 :
{-# LANGUAGE ExistentialQuantification #-}
data Any = forall a. {- here can be restrictions on `a` => -} Any a
ls :: [Any]
ls = [Any (4 :: Int), Any (3.2 :: Double), Any True, Any "home"]
유형 집합이 닫혀 있으면 ADT 만 사용할 수 있습니다.
data Variant = I Int | D Double | B Bool | S String
ls :: [Variant]
ls = [I 4, D 3.2, B true, S "home"]
따라서 올바른 솔루션을 선택하려면 문제에 대해 더 많이 알아야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다