Forma normal de cabeça fraca de Haskells

9
duepiert 2020-02-05 01:09.

Eu tropecei em algumas coisas irritantes. Eu sei que o haskell funciona com a forma normal da cabeça fraca (WHNF) e eu sei o que é isso. Digitando o seguinte código no ghci (estou usando o comando: sprint que reduz a expressão para WHNF, pelo que sei.):

let intlist = [[1,2],[2,3]]
:sprint intlist

intlist = _isso faz totalmente sentido para mim.

let stringlist = ["hi","there"]
:sprint stringlist 

stringlist = [_,_]Isso já me confunde. Mas então:

let charlist = [['h','i'], ['t','h','e','r','e']]
:sprint charlist

surpreendentemente dá charlist = ["hi","there"]

Pelo que entendi Haskell, strings nada mais são do que listas de caracteres, o que parece ser confirmado pela verificação dos tipos "hi" :: [Char]e ['h','i'] :: [Char].

Estou confuso, porque no meu entendimento todos os três exemplos acima são mais ou menos iguais (uma lista de listas) e, portanto, deveriam reduzir-se ao mesmo WHNF, ou seja, _. o que estou perdendo?

obrigado

1 answers

5
K. A. Buhr 2020-02-05 07:29.

Note-se que :sprintse não reduzir a uma expressão para WHNF. Se assim fosse, o seguinte daria em 4vez de _:

Prelude> let four = 2 + 2 :: Int
Prelude> :sprint four
four = _

Em vez disso, :sprintrecebe o nome de uma ligação, atravessa a representação interna do valor da ligação e mostra as "partes já avaliadas" (ou seja, as partes que são construtores), enquanto usa _como um marcador para thunks não avaliados (ou seja, a função preguiçosa suspensa chamadas). Se o valor for totalmente desvalorizado, nenhuma avaliação será feita, nem mesmo para o WHNF. (E se o valor for completamente avaliado, você obterá isso, não apenas WHNF.)

O que você está observando em seus experimentos é uma combinação de tipos numéricos polimórficos versus monomórficos, diferentes representações internas para strings literais versus listas explícitas de caracteres, etc. Basicamente, você está observando diferenças técnicas em como diferentes expressões literais são compiladas em código de bytes. Portanto, interpretar esses detalhes de implementação como tendo algo a ver com WHNF vai confundi-lo desesperadamente. Geralmente, você deve usar apenas :sprintcomo uma ferramenta de depuração, não como uma forma de aprender sobre o WHNF e a semântica da avaliação de Haskell.

Se você realmente deseja entender o que :sprintestá acontecendo, pode ativar alguns sinalizadores no GHCi para ver como as expressões estão realmente sendo tratadas e, portanto, eventualmente compiladas para bytecode:

> :set -ddump-simpl -dsuppress-all -dsuppress-uniques

Depois disso, podemos ver a razão do seu intlist_:

> let intlist = [[1,2],[2,3]]
==================== Simplified expression ====================
returnIO
  (: ((\ @ a $dNum -> : (: (fromInteger $dNum 1) (: (fromInteger $dNum 2) [])) (: (: (fromInteger $dNum 2) (: (fromInteger $dNum 3) [])) []))
      `cast` <Co:10>)
     [])

Você pode ignorar o returnIOe a :chamada externa e se concentrar na parte que começa com((\ @ a $dNum -> ...

Aqui $dNumestá o dicionário da Numrestrição. Isso significa que o código gerado ainda não resolveu o tipo real ano tipo Num a => [[a]], portanto, a expressão inteira ainda é representada como uma chamada de função tomando um (dicionário para) um Numtipo apropriado . Em outras palavras, é uma ideia não avaliada e obtemos:

> :sprint intlist
_

Por outro lado, especifique o tipo como Inte o código será completamente diferente:

> let intlist = [[1::Int,2],[2,3]]
==================== Simplified expression ====================
returnIO
  (: ((: (: (I# 1#) (: (I# 2#) []))
         (: (: (I# 2#) (: (I# 3#) [])) []))
      `cast` <Co:6>)
     [])

e assim é a :sprintsaída:

> :sprint intlist
intlist = [[1,2],[2,3]]

Da mesma forma, strings literais e listas explícitas de caracteres têm representações completamente diferentes:

> let stringlist = ["hi", "there"]
==================== Simplified expression ====================
returnIO
  (: ((: (unpackCString# "hi"#) (: (unpackCString# "there"#) []))
      `cast` <Co:6>)
     [])

> let charlist = [['h','i'], ['t','h','e','r','e']]
==================== Simplified expression ====================
returnIO
  (: ((: (: (C# 'h'#) (: (C# 'i'#) []))
         (: (: (C# 't'#)
               (: (C# 'h'#) (: (C# 'e'#) (: (C# 'r'#) (: (C# 'e'#) [])))))
            []))
      `cast` <Co:6>)
     [])

e as diferenças na :sprintsaída representam artefatos de quais partes da expressão GHCi considera avaliadas ( :construtores explícitos ) versus não avaliados (os unpackCString#thunks).

Related questions

MORE COOL STUFF

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett dormiu com o marido depois de 3 dias juntos e ainda está casada com ele 25 anos depois

Cate Blanchett desafiou os conselhos típicos de namoro quando conheceu o marido.

Por que Michael Sheen é um ator sem fins lucrativos

Por que Michael Sheen é um ator sem fins lucrativos

Michael Sheen é um ator sem fins lucrativos, mas o que exatamente isso significa?

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

Hallmark Star Colin Egglesfield Pratos Emocionantes Encontros de Fãs no RomaDrama Live! [Exclusivo]

A estrela da Hallmark Colin Egglesfield falou sobre emocionantes encontros com fãs no RomaDrama Live! além de seu programa INSPIRE na convenção.

Por que você não pode transmitir 'Exposição do Norte' online

Por que você não pode transmitir 'Exposição do Norte' online

Você terá que tirar o pó de um Blu-ray ou DVD player para ver por que Northern Exposure se tornou um dos programas mais populares dos anos 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Como a matéria branca ajuda a função da matéria cinzenta do cérebro

Todos nós já ouvimos falar da massa cinzenta do cérebro, mas e a massa branca? O que isso faz?

Doe seu cabelo para ajudar a manter nossa água limpa

Doe seu cabelo para ajudar a manter nossa água limpa

Aparas de cabelo de salões e doações pessoais podem ser reaproveitadas como tapetes que absorvem derramamentos de óleo e ajudam a proteger o meio ambiente.

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

Um olhar sobre os casamentos mais memoráveis ​​da Casa Branca

Apenas algumas pessoas se casaram na Casa Branca nos últimos 200 anos. Quem eram eles e o que é necessário para marcar um casamento lá?

A Porsche encerrará seu programa de protótipos de Le Mans esta semana: Relatório

A Porsche encerrará seu programa de protótipos de Le Mans esta semana: Relatório

Crédito da foto: A Porsche Porsche anunciará o encerramento de seu programa de protótipo 919 Hybrid Le Mans de primeira classe nas próximas 24 horas, de acordo com várias publicações e fontes da indústria citadas pela Sportscar365. Isso deixará a melhor classe LMP1 do Campeonato Mundial de Resistência com apenas uma equipe e um futuro incerto.

'Just Like Actual What the Fuck': InstaStory atira Thunderbolt no coração da comunidade de Cupcakes e Cashmere

'Just Like Actual What the Fuck': InstaStory atira Thunderbolt no coração da comunidade de Cupcakes e Cashmere

Captura de tela via @thehyperbalist. Alina Gonzalez, uma ex-funcionária do popular blog de estilo de vida Cupcakes and Cashmere, lançou uma das mais longas histórias do Instagram que eu pessoalmente já vi discutindo publicamente as circunstâncias de sua demissão.

Legal: Júpiter tem 69 luas

Legal: Júpiter tem 69 luas

Imagem via AP. Você nunca está velho demais para descobrir coisas novas, e todos nós podemos nos deliciar com a descoberta de que Júpiter está crescendo - com luas, é claro.

RIP Betamax: Sony anunciou que não produzirá mais fitas Betamax

RIP Betamax: Sony anunciou que não produzirá mais fitas Betamax

Esta imagem foi removida por motivos legais. Lembra-se dos velhos tempos, quando você tinha que colocar uma coisa dentro da coisa que ficava em cima da coisa para assistir uma coisa? A Sony está finalmente encerrando essa era.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Carne de porco Mapo de Dawn Burrell e homus de Edamame

Carne de porco Mapo de Dawn Burrell e homus de Edamame

"Esta é uma indústria dominada por homens, e estou feliz por ser uma das pessoas que quebrou o molde para ajudar as mulheres de cor", diz Top Chef: finalista de Portland e chef-parceiro do final de agosto em Houston. "Muitas vezes somos ignorados e às vezes não ensinados, mas isso vai mudar."

Kate Middleton passa um dia à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

Kate Middleton passa um dia à beira da água em Londres, além de Jennifer Lopez, Julianne Hough e mais

Kate Middleton passa um dia na água em Londres, além de Jennifer Lopez, Julianne Hough e muito mais. De Hollywood a Nova York e em todos os lugares, veja o que suas estrelas favoritas estão fazendo!

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Jovem de 17 anos esfaqueado até a morte enquanto outros 4 ficaram feridos em um ataque de faca no rio Wisconsin

Investigadores estão investigando se o grupo e o suspeito se conheciam antes do ataque

Como eu escrevo

Como eu escrevo

Para mim, tudo é sobre aquela primeira linha e onde ela te leva. Alguns escritores são movidos pelo enredo, pelo delicado arranjo das peças de xadrez, enquanto outros são atraídos por um personagem e pela capacidade de viajar com um novo amigo fictício.

Aterrissagens na pista

Aterrissagens na pista

O final do verão e o outono são estações nostálgicas. Os postes de luz lançam sua luz sobre as ruas escorregadias pela chuva, e as folhas sob os pés – vermelho-alaranjado nas sombras do crepúsculo – são um lembrete de dias passados.

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

Imagine criar uma estratégia de conteúdo que realmente CONVERTE. É possível.

Em 2021, encorajo você a repensar tudo o que sabe sobre os clientes que atende e as histórias que conta a eles. Dê um passo para trás.

Uma perda gigantesca abriu meu coração para o amor

Uma perda gigantesca abriu meu coração para o amor

No dia do aniversário de 9 anos de Felix The Cat, lembro-me de uma das maiores perdas da minha vida adulta – minha Sophie em 2013. Escrevi este ensaio e o compartilhei brevemente nesta plataforma em 2013.

Language